Как разрешить "Незаконные символы в пути"?
У меня есть приложение 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), я получаю a "System.ArgumentException: Незаконные символы в пути."
После долгих поисковых запросов лучшие предложения, похоже, состоят в том, чтобы убедиться, что URL-адрес не содержит таких символов. К сожалению, это не в моем распоряжении в этом случае.
Есть ли способ обойти это?
Ответы
Ответ 1
Скотт Ханзельман опубликовал хорошее резюме на разрешающее незаконные символы в пути.
Если вы действительно хотите разрешить символы, которые ограничены, удалите их из списка, отредактировав ваш 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 =% с указанными выше шагами.
Ответ 2
Оказывается, вы могли бы избежать этого, установив allowDoubleEscaping = "false" in для requestFiltering в web.Config.
То есть:
<configuration>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="false" />
</security>
</system.webServer>
</configuration>
Возможно, это не идеальное решение (любые предложения для лучшего из них очень ценятся), но он решает проблему.
Ответ 3
Вы должны URL-кодировать URL-адрес на стороне клиента перед его отправкой. Попробуйте использовать метод UrlHelper.Encode.
Ответ 4
Как насчет амперсанда (&) в URL-адресе? Например: mysite.com/JellyBeans/PB&J, где "PB & J" - значение параметра в методе действий контроллера. Как вы обойдете MVC и механизм ASP.NET от обработки этого как незаконного char в базовой строке url? Кодировка с% 26 не работает. Странно, когда при запуске VS-отладки локальный веб-сервер (VS, встроенный в веб-сервер) обрабатывает этот случай (оба как и и% 26), но при развертывании на веб-сервере, на котором запущен IIS7, URL-адрес приводит к "неправильному запросу" ".