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

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

http://example.com/user:chaiguy

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

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

Мы будем очень благодарны за любые мысли или идеи.


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

...

Тогда я предлагаю вам изучить создание веб-службы. 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, исходя из того, что я еще о нем знаю). То есть это скорее выбор запроса с динамической оценкой, чем зашитый путь к файлу. Он оценивается на сервере.

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


person devios1    schedule 20.03.2009    source источник
comment
Какая версия IIS? 6?   -  person Sean Bright    schedule 20.03.2009
comment
Честно говоря, я просто запускаю его на сервере разработки ASP.NET в настоящий момент, не зная на 100%, что работает на моем фактическом веб-хосте.   -  person devios1    schedule 20.03.2009
comment
Ах. Тогда двоеточие будет перехвачено еще до того, как попадет в HttpHandler. Так что вы могли бы быть S.O.L.   -  person Sean Bright    schedule 20.03.2009
comment
Хм, облом. Думаю, я мог бы сделать это с параметрами URL-адреса достаточно легко, например ? user = chaiguy, но поддерживаются ли параметры в сегментах пути, например /? user = chaiguy / address?   -  person devios1    schedule 20.03.2009
comment
Если вы используете параметры запроса, вы теряете одно из самых больших преимуществ ASP.NET MVC: URL-адреса RESTful.   -  person Randolpho    schedule 20.03.2009
comment
Кроме того, я на 95% уверен, что вы не можете использовать список параметров запроса в определенном сегменте пути.   -  person Randolpho    schedule 20.03.2009
comment
REST не работает с параметрами запроса? Я думал, что REST - это просто взаимодействие, управляемое URL-адресом. Почему параметры запроса не учитываются?   -  person devios1    schedule 20.03.2009
comment
Да, я проверил, что такое сегмент пути, он просто обрабатывает все, что следует за? как часть строки запроса, включая любые дальнейшие косые черты.   -  person devios1    schedule 20.03.2009
comment
как насчет закодированного двоеточия? % 25 или любое другое двоеточие. Или я могу предложить пользователя (имя) или подобное.   -  person No Refunds No Returns    schedule 14.02.2010
comment
Имея тот же вопрос, и я заметил, Википедия использует двоеточия в сегменте пути: 2001 : Космическая одиссея. Разве это не сайт №3 в Интернете? Также обратите внимание, что в Firefox, если вы копируете адрес, он кодирует скобки, но не двоеточие. Однако, если вы вызовете encodeURIComponent (':'), вы получите% 3A. Это моя лакмусовая бумажка. Двоеточие запрещено (очень плохо, мне это тоже пригодится).   -  person harpo    schedule 14.05.2011
comment
Действительно, в Википедии двоеточия используются повсюду, даже в очень заметных местах, где нет очевидной пользы, например в их свяжитесь с нами. Вы должны задаться вопросом, если это так опасно, как им это сходит с рук? Конечно, я понимаю, что википедия не использует .NET, но вопрос (во всяком случае для меня) действительно вращается вокруг того, являются ли двоеточия допустимыми символами в URL-адресах, независимо от платформы.   -  person harpo    schedule 14.05.2011


Ответы (8)


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

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

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

person Jacob Krall    schedule 25.04.2011
comment
Это безопасно? мы бы хотели удалить только двоеточие, а не другие символы? - person Karlas; 29.04.2014
comment
Это не работает с ASP.Net 4. Даже с requestValidationMode="2.0". - person Badgerspot; 25.07.2014
comment
Это должно быть записано в configuration > system.web > httpRuntime. - person androbin; 24.06.2019

Ответил на аналогичный вопрос здесь: https://stackoverflow.com/a/12037000/134761

Кажется, что 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» в качестве аргумента идентификатора, правильно декодированного. Я только что протестировал это с помощью MVC4, и, похоже, он работает. Раздражает то, что он не принимает кодировку URL перед вопросительным знаком, но я уверен, что для этого есть веская причина. Вероятно, чтобы все, что было до вопросительного знака, было действительным URL-адресом, и все аргументы после вопросительного знака.

person angularsen    schedule 23.08.2012
comment
На самом деле http://foo.org/api/persons?id=foo:abar тоже будет работать нормально - нет необходимости экранировать двоеточие. - person Evgeniy Berezovsky; 19.10.2012
comment
Как я уже сказал, это правило применяется только к пути, то есть ко всему, что находится слева от вопросительного знака. Справа от вопросительного знака допускается двоеточие. - person angularsen; 19.10.2012

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

person Sriram Krishnan    schedule 07.07.2009
comment
Действительно ли двоеточие даже в URL-адресе в этот момент? В противном случае просто не делайте этого, поскольку http.sys не будет единственным программным обеспечением, которому он не понравится. - person John Saunders; 07.07.2009

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

<httpRuntime targetFramework="4.6.1" requestPathInvalidCharacters=""/>
person Siegfried Niedinger    schedule 15.12.2016

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

person Randolpho    schedule 20.03.2009
comment
Я понимаю, что это вариант, и ценю предложение, но мне очень нравится делать это таким образом. Если я не могу использовать двоеточие, я, скорее всего, буду использовать другой символ, но двоеточие было бы идеальным. - person devios1; 20.03.2009
comment
Потому что то, что я хочу делать, сильно отличается и включает в себя взаимодействие на основе URL-адресов с не-веб-системой. - person devios1; 20.03.2009
comment
Тогда я предлагаю вам изучить создание веб-службы. WCF - отличная технология для этого, и она хорошо размещается в IIS. - person Randolpho; 20.03.2009

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

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

person BinaryMisfit    schedule 07.07.2009
comment
Разве вы не имеете в виду мощь WCF и простоту REST? ;) - person devios1; 26.04.2011

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

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

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

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

по сути '--h - m - s'

person Dennis    schedule 02.01.2012

Допустимо ли двоеточие в URL-адресе? Краткий ответ нет.

Длинный ответ, да, если он находится в фрагменте URL.

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

Источники

person Chris Marisic    schedule 04.04.2011
comment
-1 В URL-адресе допустимо двоеточие. Проверьте грамматику RFC 2396, на которую ссылается спецификация HTTP 1.1 или грамматика нового RFC 3986. Вы обнаружите, что двоеточие также действует как в пути, так и в запросе. - person Evgeniy Berezovsky; 19.10.2012
comment
@EugeneBeresovksy meh Я поддерживаю свой ответ, особенно по последнему пункту. - person Chris Marisic; 11.03.2014
comment
Re: ваш последний пункт. ОП знал об этой проблеме, поэтому и спросил. Я связался с соответствующими RFC, которые показывают, что двоеточия допустимы. Фактически, проблема может быть в двоеточиях во фрагментах (в зависимости от используемой версии HTML). Тем не менее, различные спецификации HTTP и HTML иногда противоречат друг другу, хотя в целом двоеточия допустимы. Другое дело, что asp.net не любит их и пытается обеспечить некоторую псевдобезопасность (которую, к счастью, можно отключить с помощью флага requestPathInvalidCharacters). - person Evgeniy Berezovsky; 13.03.2014