2010-07-14 6 views
0

Je me trouve dans une situation difficile. Nous travaillons sur une application ASP.NET MVC 2 composée de plusieurs sections. C'est un objectif de conception que ces sections couvrent plusieurs sous-domaines. Chaque sous-domaine aura son propre contrôleur.Routage d'URL à travers plusieurs sous-domaines

Le défi est que le panneau de contrôle de notre fournisseur d'hébergement permet deux formes de redirection pour les sous-domaines, et aucun d'entre eux ne semble correspondre à la facture. Les choix sont les suivants:

  • Redirection vers l'URL. Le choix est donné s'il faut rediriger vers une destination exacte ou une destination par rapport à l'URL de la demande.

  • Redirection vers un dossier spécifique dans mon espace d'hébergement.

Je vais essayer d'illustrer le comportement prévu. En supposant que la route par défaut est {controller}/{action}/{id}, je voudrais que l'URL http://subdomain.welcome.com/a/b soit traitée par l'application MVC comme http://welcome.com/subdomain/a/b.

La redirection d'URL pourrait résoudre ce problème, sauf pour le fait que l'utilisateur voit un changement d'URL se produire dans le navigateur. Nous ne voulons pas que le client voit la redirection se produire.

La redirection vers notre dossier racine des applications MVC ne fonctionne pas du tout. L'application ne récupère pas la demande et une erreur 4xx est renvoyée par IIS.

modifier:

Dans l'intérêt de trouver une réponse, je vais simplifier un peu. Le "rediriger vers l'URL" ne fait pas ce que je veux, ce qui laisse rediriger vers un dossier.

Si je redirige un sous-domaine vers le dossier racine de mon application MVC et que IIS ne récupère pas les demandes, est-ce une limitation de IIS ou de mon fournisseur?

Répondre

6

Pouvez-vous faire vos en-têtes d'accueil du site d'hébergement répondent à *.mydomain.com? En d'autres termes, votre site Web peut-il demander des sous-domaines de votre domaine principal? Si oui, puis référence this post sur la façon de gérer le routage de sous-domaine dans les applications MVC et vous devriez être bon à faire.

Je mettrais à jour le code dans la publication, mais pour rendre le code plus succinct. Dans tous les cas, assurez-vous d'avoir vos erreurs 404 en place pour les personnes qui essaient d'aller à des sous-domaines qui n'existent pas.

public class ExampleRoute : RouteBase 
{ 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var url = httpContext.Request.Headers["HOST"]; 
     var index = url.IndexOf("."); 

     if (index < 0) 
      return null; 

     var subDomain = url.Substring(0, index); 

      var routeData = new RouteData(this, new MvcRouteHandler()); 
      routeData.Values.Add("controller", subdomain); //attempts to go to controller action of the subdomain 
      routeData.Values.Add("action", "Index"); //Goes to the Index action on the User2Controller 

      return routeData; 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     //Implement your formating Url formating here 
     return null; 
    } 
} 
0

Je ne sais pas si cela est exagéré (ce qui est utilisé pour servir les pages d'un fichier zip ou fichier de ressources, etc.), mais ... vous pourriez peut-être utiliser un fournisseur de chemin virtuel? ..

Mettre en oeuvre une classe qui hérite de VirtualPathProvider, et se connecter au démarrage global comme ceci:

HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider()); 

Ensuite implémenter une classe qui hérite de VirtualFile et le servir de la dérogation dans votre implémentation de fournisseur de chemin virtuel GetFile():

public override VirtualFile GetFile(string virtualPath) 
{ 
if(IsVirtualFile(virtualPath)) 
    return new MyVirtualFile(virtualPath); 
return base.GetFile(virtualPath); 
} 

Note: IsVirtualFile est une fonction que vous auriez à mettre en œuvre, sur la base des règles que vous avez en ce qui concerne le format d'URL, etc.

Questions connexes