Подтвердить что ты не робот

Использование двоеточия (:) в URL-адресе с ASP.NET/IIS

Я реализую настраиваемый контроллер в ASP.NET MVC и действительно хочу иметь возможность использовать двоеточие в URL-адресах, чтобы я мог идентифицировать имена классов и столбцов и их значения, например:

http://example.com/user:chaiguy

... но, видимо, ASP.NET или IIS не разрешают двоеточия в URL-адресах. Я сделал некоторые копания и, по-видимому, рассматривал проблему безопасности, но я использую MVC и обрабатываю все пути URL вручную (просто рассматривая их как строки) и не связывая их с файловой системой, поэтому я уверен, что это не применяется.

Я также слышал некоторые разговоры о внедрении пользовательского Http-обработчика или что-то в этом роде.

Любые мысли или идеи будут высоко оценены.


Er.... почему? Серьезно, зачем нарушать стандарты? - Рэндольфо

...

Я предлагаю, чтобы вы исследовали создание веб-службы. WCF - хорошая технология для этого, и он хорошо переносится в IIS.

Мне нравятся URL-адреса, а WCF слишком сложна для моих целей. Я хочу, чтобы он был совместим с url, например REST, но способен не только перемещаться по иерархиям, но и выполнять хорошо продуманные вещи. Проблема с /users/chaiguy заключается в том, что она интерпретирует иерархию там, где ее нет: в моей системе "пользователь" - это класс, это не папка. user: chaiguy означает экземпляр класса пользователя со значением "chaiguy", и это единый объект, который имеет потенциал наличия дочерних объектов. Так, например:

/user:chaiguy/name

... Я хотел бы отобразить имя этого объекта. Если бы я сделал это с помощью вашего метода, это выглядело бы так:

/users/chaiguy/name

Проблема в том, как вы знаете, что такое класс и какое значение? Его можно интерпретировать как

/users/chaiguy:name

в моей системе, и это не имеет смысла. Посмотри, что я получаю? Чтобы дать несколько более сложный пример, предположим, что мы хотим выбрать дочерний элемент пользователя из нескольких экземпляров. Таким образом, пользователь может иметь несколько адресов электронной почты. Чтобы выбрать один, мы можем использовать:

/user:chaiguy/email:[email protected]/

Таким образом, это фактически рекурсивно. Это не путь к файлу, он больше похож на XPath (или, может быть, похож на jQuery, основанный на том, что я немного знаю об этом). То есть, это скорее динамически оцениваемый выбор запроса, чем проводной путь к файлу. Он оценивается на сервере.

Не ошибитесь, я не строю типичный веб-сайт или даже веб-сервис здесь.

4b9b3361

Ответ 1

Измените атрибут requestPathInvalidCharacters httpRuntime в web.config:

<httpRuntime maxRequestLength="20480" requestValidationMode="2.0" requestPathInvalidCharacters="" maxQueryStringLength="20480" />

и ASP.NET больше не должен блокировать двоеточия из вашего пути запроса.

Ответ 2

Ответил аналогичный вопрос здесь: fooobar.com/questions/280762/...

Кажется, что ASP.net не разрешает двоеточия до '?' в URL, даже если он закодирован как% 3A.

Например, они не будут работать:

http://foo.org/api/persons/foo:bar

http://foo.org/api/persons/foo%3abar

Но это работает:

http://foo.org/api/persons?id=foo%3abar

Во всех примерах мы ожидаем, что ASP.NET MVC передаст "foo: bar" в качестве аргумента id, правильно декодированного. Я просто проверил это с MVC4 и, похоже, сработал. Досадно, что он не принимает кодировку URL перед вопросительным знаком, но я уверен, что для этого есть веская причина. Вероятно, чтобы сохранить все до того, как вопросик отметит действительный URL-адрес и любые аргументы после вопросительного знака.

Ответ 3

Я предлагаю вам переосмыслить то, что вы хотите сделать. Используйте pathing, чтобы указать контекст и скрыть ваши имена классов и полей, сопоставляя определенные контексты в ваших URL-адресах с именами классов и полями. Если вам нужно указать пользователя, например, постройте URL-адрес, например example.com/users/chaiguy, а не example.com/user:chaiguy.

Ответ 4

Попробуйте установить HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters\AllowRestrictedChars. Это от http://support.microsoft.com/?id=820129. Я не знаю, выполняет ли ASP.NET/MVC некоторую проверку самостоятельно, но если она блокирует вас только http.sys, это должно исправить ее.

Ответ 5

На самом деле есть WCF REST, и вы можете легко вставать и работать в течение часа, используя доступный набор инструментов WCF здесь. Это берет власть REST и объединяет ее с легкостью WCF. Кроме того, с WCF вы также можете создать свой собственный транспортный уровень, если вам нужно, чтобы он мог запросить URL-адрес любым способом. Одна интересная вещь в стартовом наборе заключается в том, что она допускала пробелы в Url, что на самом деле вызывало некоторые головные боли для истинных фондов REST.

Я не хотел смотреть на него из-за WCF, но вам действительно не нужно это знать. Решение создает все, что вам нужно, просто добавьте код.

Ответ 6

Эта настройка web.config работала для меня. Он принимает двоеточия (:) в URL.

<httpRuntime targetFramework="4.6.1" requestPathInvalidCharacters=""/>

Ответ 7

Я бы предложил использовать период. REST, основанный на протоколе HTTP, является примером построения нового использования для HTTP, который придерживался стандартов и был очень успешным. Возможно, вы можете это сделать.

И a '.' является стандартным "class.method" или "class.attribute" во многих langauges.

Теперь ME, я хотел использовать двоеточие в параметрах URL-адреса времени, и некоторые места делают это. Я все еще должен посмотреть, смогу ли я сойти с рук.

PS, для меня я могу использовать это:    http://www.businesscasualblog.com/2009/07/how-to-share-a-link-to-a-specific-timecode-in-youtube-video.html

esentially '--h - m - s'

Ответ 8

Является ли двоеточие действительным в URL-адресе? Короткий ответ нет.

Длинный ответ, да, если он в URL .

Пример: http://site/gwturl#user:45/comments (обратите внимание, что двоеточие обрабатывает хэш-тег)

Источники