2013-06-10 3 views
1

J'ai un comportement vraiment étrange dans ASP.NET MVC3. Fondamentalement, j'ai écrit un HttpModule qui se déclenche sur BeginRequest qui potentiellement réécrit mon URL en utilisant HttpContext.RewritePath(string). Cela fonctionne correctement dans la plupart des cas, mais j'ai remarqué que lorsque j'ai un espace dans mon URL, ASP.NET MVC se comporte différemment lors de la réécriture.MVC3 personnalisé URL Rewriter HttpModule RouteData corruption

Exemple URL:

http://www.mysite.com/my%20url 

Mon rewriter est configuré avec Regex, semblable à Helicon, où il peut capturer un groupe et utiliser ce groupe capturé dans la réécriture. Une règle d'exemple:

<add original="^/(.*)\?test$" rewritten="/$1" /> 

Ceci réécrire une URL telle que http://www.mysite.com/my%20url?test-http://www.mysite.com/my%20url < - noter que le querystring va. Cela fonctionne correctement.

Et mon routage MVC est configuré pour capturer la partie my%20url avec un caractère générique afin de le mapper à une valeur RouteData sous la clé de "navstate". La règle ressemble à:

"{*navstate}" 

Alors, quand je ne réécris, mon RouteDataDictionary contient:

key: "navstate" value: "my url" 

Quand je fais réécris, mon RouteDataDictionary contient:

key: "navstate" value: "my%20url" 

Notez que il n'a pas URL Décoder la variable RouteData.

Est-ce que quelqu'un a des idées à ce sujet? La seule chose qui semble faire la différence est l'utilisation de HttpContext.RewritePath(string) dans mon HttpModule ... Eteindre le module assure une fonctionnalité correcte. Décoder manuellement l'URL avant l'appel de réécriture en utilisant HttpUtility.UrlDecode(string) permet également de le faire fonctionner ... mais se sent comme un hack.

EDIT:

Cela semble être un bug pas avec MVC, mais avec ASP.NET Routing, j'ai donc mis à jour les balises en tant que tel.

Répondre

2

J'ai vérifié et c'est comme je pensais. La réécriture d'URL et le routage n'ont pas été conçus pour être utilisés ensemble sur la même demande. Pensez à Routing comme une forme spéciale de réécriture d'URL, de sorte que les deux interférer les uns avec les autres.

Je sais que cela ressemble à un bogue parce que ça ne fonctionne pas comme prévu, mais cela fonctionne exactement comme il est censé le faire. Pensez au pipeline et à l'arrivée de vos modules par rapport au travail déjà effectué par le module de routage. Les choses doivent arriver dans l'ordre, de sorte que le décodage se produise, la réécriture de l'url arrive, etc.

+0

Assez juste. Il est logique que si le décodage se produisait avant mon événement BeginRequest, que je devais re-décoder mon URL réécrite. Merci Scott - J'apprécie vraiment la recherche et le suivi. Serait-il utile de forcer le décodage sur l'affectation RouteDataDictionary dans une future construction de l'assembly de routage? – Haney