Контекст: ASP.NET MVC, работающий в IIS, с UTF-8 %-закодированный URL.
Использование стандартного шаблона проекта и тестового действия в HomeController
, например:
public ActionResult Test(string id)
{
return Content(id, "text/plain");
}
Это отлично работает для большинства маршрутов UTF-8 с% -кодированием, таких как:
http://mydevserver/Home/Test/%e4%ba%ac%e9%83%bd%e5%bc%81
с ожидаемым результатом京都 弁
Однако при использовании маршрута:
http://mydevserver/Home/Test/%ee%93%bb
URL-адрес не получен правильно.
Кроме того: % ee% 93% bb
-% -кодированный код 0xE4FB; базовый многоязычный самолет, территория частного пользования; но в конечном итоге - действительный код Юникода; вы можете проверить это вручную или через:
string value = ((char) 0xE4FB).ToString();
string encoded = HttpUtility.UrlEncode(value); // %ee%93%bb
Теперь, что будет дальше, зависит от веб-сервера; на сервере разработки Visual Studio (он же cassini) получен правильный id
- строка длиной один, содержащая кодовую точку 0xE4FB.
Если, однако, я сделаю это в IIS или IIS Express, я получу другой идентификатор
, а именно «î« »»
, кодовые точки: 0xEE, 0x201C, 0xBB . Вы сразу узнаете первую и последнюю в качестве начала и конца нашей закодированной в процентах строки ... так что же произошло посередине?
Итак:
Мне кажется, что IIS выполнил какую-то цитату - перевод при обработке моего url. Возможно, это могло быть использовано в нескольких сценариях (я не знаю), но это определенно плохо, когда это происходит в середине блока UTF-8, закодированного в%.
Обратите внимание, что HttpContext.Current.Request.Raw
также показывает, что этот перевод произошел, поэтому это не похоже на ошибку MVC; обратите внимание также на комментарий Дарина, подчеркнув, что он работает по-разному в части URL-адреса пути и запроса.
Итак (двухчастный):