2010-11-19 31 views
0

J'ai un module HTTP exécuté dans IIS 7 qui fournit un certain nombre de services de réécriture d'URL différents.IIS7 HTTPModule impossible de réécrire le chemin d'accès à une sous-application MVC

Par exemple:

public void Init(HttpApplication context) 
{ 
    ... 
    HttpContext.Current.RewritePath(landingPage.NewPath, 
           string.Empty, 
           landingPage.NewQueryString + 
           ((landingPage.NewQueryString == string.Empty) ? "" : "&") + 
           queryString); 
    ... 
} 

J'ai une application sous avec sa propre piscine app écrite dans MVC: http://www.SomeSiteWithURLrewrite.com/SubMVCApplication/

Ce module fonctionne très bien sauf pour les applications MVC créées en tant que sous-applications.

Quand je fais une demande http qui sera réécrite: http://www.SomeSiteWithURLrewrite.com/Arbitrary/Path/To/Be/Rewritten

Je reçois une erreur HTTP 404.0 - Not Found

La page d'erreur 404 indique qu'il y avait un appel à "http://www.SomeSiteWithURLrewrite.com/Arbitrary/Path/To/Be/Rewritten" qui avait été réécrit dans le chemin physique "C: {RootDirectory} \ SubMVCApplication \ "avec le gestionnaire de" StaticFile ".

Je ne sais pas pourquoi le pipline ne reconnaît pas le "HttpContext.Current.RewritePath" comme une requête MVC. Est-ce parce que l'application MVC est dans sa propre application?

Comment puis-je appeler RewritePath (ou quelque chose de similaire) et ont IIS rendent un ASP.Net MVC page.in une application sous

Répondre

2

Si vous traversez les limites d'application, vous devrez faire un Response.Redirect qui questions un client HTTP 301 redirect commande

RewritePath est un serveur seule commande, et doit avoir accès aux tables de routage, etc. Ainsi, seule la limite de l'application actuelle

Il n'y a pas de réponse facile, autre que de faire un proxy page chaque application Web pour passer à travers le contenu, mais ce serait très inefficace

par exemple. server.com/a/x réécrit sur server.com/b/x, votre code devrait détecter le changement de limite de l'application et, à la place, rediriger une demande HTTPRequest pour obtenir le contenu server.com/b/x et transmettre ce contenu au client? Les chemins de ressources etc. deviendraient un gros problème donc probablement pas une bonne idée

0

Je ne suis pas du tout d'accord avec TFD's answer. Tout dépend de l'algorithme que vous souhaitez implémenter.

Here Vous pouvez trouver une description détaillée sur le routage et la réécriture d'URL. Quant à moi pour la raison de mettre en œuvre la structure des URL de base de l'arbre est préférable d'utiliser la réécriture d'URL avant que le routage, à

transform URL: my.site.com/page1/page2/page3/faq.aspx
à: my.site.com/content/faq.aspx?parent=page3/page2/page1

content est le nom du contrôleur et faq est un identifiant unique.

Les données peuvent provenir de la base de données ou du fichier de sitemap.