Как разрешить "Незаконные символы в пути"?

У меня есть приложение 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

В целом, это нормально работает, но если путь содержит недопустимые символы (например, двойные символы: http://domain/member/123/my_"user" _name), я получаю "System.ArgumentException: недопустимые символы в пути".

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

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

4 ответа

Скотт Хансельман опубликовал хорошее резюме о разрешении нелегальных символов в пути.

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

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

Вам также может понадобиться сделать так, как подсказывает hbruce:

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

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

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

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

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

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

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

Другие вопросы по тегам