28 votes

Routage de sous-domaine MVC 3

Double Possible:
Est-il possible de faire une ASP.NET MVC itinéraire basé sur un sous-domaine?

Dans asp.net MVC 3 site j'aimerais créer des boutiques en ligne pour les utilisateurs. N'importe quel magasin qui est créé par l'utilisateur doit avoir une URL du type "shopname.mydomain.com".

J'ai essayé un peu de routage de travail, mais a échoué à tous. Je suis à la recherche d'une solution, mais ne peut pas trouver de solution adéquate.

Mon but est que; si je peux ajouter un itinéraire à gérer toute demande qui tente de trouver un sous-domaine, je vais vérifier si c'est un utilisateur de la boutique en ligne de nom et d'obtenir la dynamique de données sur le jeu.

Besoin d'acheminement de l'aide :) Merci.

17voto

Bahtiyar Özdere Points 328

J'ai trouvé un moyen très puissant. Afin de vérifier cela :)

Tout d'abord pour le développement d'applications serveur de visual studio, vous devez modifier le fichier hosts.

Ouvrez le bloc-notes en tant qu'administrateur. Ajouter un nom pour votre domaine, quelque chose comme

127.0.0.1 mydomain.com 127.0.0.1 sub1.mydomain.com

et ce dont vous avez besoin pour utiliser sur le développement.

Après le donner un numéro de port spécifique pour votre projet web. Par exemple "45499". De cette façon vous serez en mesure de sen demande à votre projet par écrit dans le navigateur :

mydomain.com:45499 ou sub1.mydomain.com:45499

C'était la préparation de l'étape. Permet de se rendre sur la réponse.

En utilisant l' IRouteConstraint classe, vous pouvez créer votre itinéraire limite.

public class SubdomainRouteConstraint : IRouteConstraint
{
    private readonly string SubdomainWithDot;

    public SubdomainRouteConstraint(string subdomainWithDot)
    {
        SubdomainWithDot = subdomainWithDot;
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var url = httpContext.Request.Headers["HOST"];
        var index = url.IndexOf(".");

        if (index < 0)
        {
            return false;
        }
        //This will bi not enough in real web. Because the domain names will end with ".com",".net"
        //so probably there will be a "." in url.So check if the sub is not "yourdomainname" or "www" at runtime.
        var sub = url.Split('.')[0];
        if(sub == "www" || sub == "yourdomainname" || sub == "mail")
        {
            return false;
        }

        //Add a custom parameter named "user". Anything you like :)
        values.Add("user", );
        return true;
    }
}

Et d'ajouter votre contraindre à n'importe quel itinéraire vous souhaitez utiliser.

routes.MapRoute(
                    "Sub", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "SubdomainController", action = "AnyActionYouLike", id = UrlParameter.Optional },
                    new { controller = new SubdomainRouteConstraint("abc.") },
                    new[] { "MyProjectNameSpace.Controllers" }
                    ); 

Mettre cette route avant de votre itinéraire par défaut. C'est tout.

Dans la contrainte que vous pouvez faire quelque chose comme vérifier pour le nom de sous-domaine est un client du nom du magasin ou quoi que ce soit.

2voto

NickLarsen Points 9591

Vous devrez ajouter une entrée DNS pour *.mydomain.com pour pointer vers l'application racine, puis lors de la gestion de la demande dans l'application racine, vérifiez l'hôte de la demande pour déterminer quel shopname est spécifié .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X