2010-01-18 2 views
16

У меня есть приложение MVC.NET с одного маршрута следующим образом:Как разрешить «Незаконные символы в пути»?

routes.MapRoute("member", "member/{id}/{*name}", new { controller = "member", action = "Details", id = "" }, new { id = @"\d+" });

Таким образом, связь может быть что-то вроде этого: http://domain/member/123/any_kind_of_username

Это прекрасно работает в целом, но если путь содержит недопустимые символы (например, double qoute: http://domain/member/123/my_ «user» _name) Я получаю «System.ArgumentException: Незаконные символы в пути».

После долгих поисковых запросов лучшие предложения, похоже, состоят в том, чтобы убедиться, что URL-адрес не содержит таких символов. К сожалению, это не в моем распоряжении в этом случае.

Есть ли способ обойти это?

+2

предположительно они называются незаконными символами, потому что вы не можете их использовать ... –

+0

Не могут ли они быть закодированы в URL? – Oded

+1

@Mitch - Ну, например, двойная цитата отлично работает для Apache, поэтому я не понимаю, почему IIS этого не допустил. @Oded - Проблема в том, что я не контролирую эти URL-адреса. – hbruce

ответ

1

Вы должны URL-кодировать URL-адрес на стороне клиента перед его отправкой. Попробуйте использовать метод UrlHelper.Encode.

+0

Извините, здесь же, как и с другими предложениями. Боюсь, я не контролирую URL-адреса клиентов. – hbruce

+3

Я получаю это, даже когда кодированный URI отправляется от клиента – IsmailS

4

Оказывается, вы могли бы избежать этого, установив allowDoubleEscaping = "false" для requestFiltering в web.Config. т.е:

<configuration> 
    <system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="false" /> 
    </security> 
    </system.webServer> 
</configuration> 

Возможно, не является идеальным решением (любые предложения по лучшей один очень ценится), но это решает проблему.

+0

@hbruce: Это лучшее решение, которое я нашел до сих пор, спасибо! – PanJanek

+1

довольно серьезный побочный эффект - вы не можете больше использовать символы, такие как '+' в URL-адресах, если вы включите этот параметр. см. http://stackoverflow.com/questions/1453218/is-enabling-double-escaping-dangerous –

0

Как насчет амперсанда (&) в адресе? Например: mysite.com/JellyBeans/PB & J, где «PB & J» - это значение параметра в методе действий контроллера. Как вы обойдете MVC и механизм ASP.NET от обработки этого как незаконного символа в базовой строке url? Кодировка с% 26 не работает. Странно, когда при запуске VS-отладки локальный веб-сервер (VS, встроенный в веб-сервер) обрабатывает этот случай штрафа (оба - как & и% 26), но при развертывании на веб-сервере под управлением IIS7 URL-адрес приводит к «плохому запросу» ».

+2

Встроенный веб-сервер VS.NET довольно неудовлетворительный и нестандартный. Если вы столкнулись с каким-то нечетным поведением, вам лучше не обращать на него внимания и просто использовать IIS. –

7

Скотт Hanselman опубликовал хорошее резюме на allowing illegal characters in the path.

Если вы действительно хотите, чтобы символы, которые ограничены, удалить их из списка редактирования web.config (это, вероятно, работать только в .NET 4 и IIS7):

<system.web> 
    <httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" /> 
</system.web> 

Вы также должны сделать как hbruce suggests:

<system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="true"/> 
    </security> 
</system.webServer> 

Есть еще какие-то определенные пути й (не работает) (например,/search /%), так как вы получите сообщение 400 «Bad Request - Invalid URL». Единственным обходным решением, которое я нашел, является использование этой части в качестве запроса:/search? Q =% с указанными выше шагами.

+0

Есть ли альтернатива для .net 2? – lathomas64

Смежные вопросы