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

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