Contexte: ASP.NET MVC cours d'exécution dans IIS, avec un encodage UTF-8 %-URL encodée.
En utilisant le modèle de projet standard, et d'un test-l'action en HomeController
comme:
public ActionResult Test(string id)
{
return Content(id, "text/plain");
}
Cela fonctionne bien pour la plupart des %-encodé en UTF-8 voies, telles que:
http://mydevserver/Home/Test/%e4%ba%ac%e9%83%bd%e5%bc%81
avec le résultat attendu 京都弁
Cependant, l'utilisation de la route:
http://mydevserver/Home/Test/%ee%93%bb
l'url n'est pas reçu correctement.
De côté: %ee%93%bb
est %codé de point de code 0xE4FB; base-multilingue-plan, privé de la zone d'utilisation; mais en fin de compte un code unicode-point; vous pouvez le vérifier manuellement, ou via:
string value = ((char) 0xE4FB).ToString();
string encoded = HttpUtility.UrlEncode(value); // %ee%93%bb
Maintenant, ce qui se passe ensuite dépend de la web-serveur; le Serveur de Développement Visual Studio (aka cassini), l'correcte id
reçu: une chaîne de caractères de longueur, contenant le code-point 0xE4FB.
Si, toutefois, je le fais dans IIS ou IIS Express, je reçois un autre id
, spécifiquement "î"»"
, code-points: 0xEE, 0x201C, 0xBB. Vous serez immédiatement reconnaître le premier et le dernier comme le début et la fin de notre pour cent-chaîne codée... donc ce qui est arrivé dans le milieu?
Bien:
Il me semble très bien comme IIS a effectué une sorte de devis de traduction lors du traitement de mon url. Maintenant peut-être que cela pourrait avoir utilise dans quelques scénarios (je ne sais pas), mais il est certainement une mauvaise chose quand il arrive dans le milieu d'un %-encodé en UTF-8 bloc.
Notez que HttpContext.Current.Request.Raw
également montre cette traduction a eu lieu, de sorte que cela ne ressemble pas à un MVC bug; note également Darin commentaire, soulignant que cela fonctionne différemment dans le chemin vs requête de la partie de l'url.
Donc (en deux parties):
- mon analyse est manquant important de la subtilité de l'unicode / url traitement?
- comment puis-je résoudre ce problème? (c'est à dire faire en sorte que je devrait recevoir le caractère)