Выполняет ли IIS недопустимую замену символов? Если да, то как это остановить?

Контекст: 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-адреса пути и запроса.

Итак (двухчастный):

  1. не упускает ли мой анализ некоторые важные тонкости обработки Unicode / url?
  2. как мне это исправить? (т.е. сделать так, чтобы я получал ожидаемый символ)

44
задан Marc Gravell 27 October 2011 в 18:42
поделиться