Как разрешить "Незаконные символы в пути"? - PullRequest
18 голосов
/ 18 января 2010

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

8 голосов
/ 20 октября 2010

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

Если вы действительно хотите разрешить запрещенные символы, удалите их из списка, отредактировав свой файл 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 =% с вышеуказанными шагами.

4 голосов
/ 19 января 2010

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

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

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

0 голосов
/ 22 мая 2010

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

0 голосов
/ 18 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...