Как разрешить "Незаконные символы в пути"?
У меня есть приложение 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="<,>,*,%,:,&,\" />
</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 приводит к "неверному запросу". ".