Pour capturer le sous-domaine tout en conservant la norme MVC5 des fonctionnalités de routage, utilisez la commande suivante SubdomainRoute
classe dérivée de l' Route
.
En outre, SubdomainRoute
permet le sous-domaine éventuellement être spécifié comme paramètre de requête, rendant sub.example.com/foo/bar
et example.com/foo/bar?subdomain=sub
équivalent. Cela vous permet de tester avant de les sous-domaines DNS sont configurés. Le paramètre de requête (lorsqu'en service) est multiplié par le biais de nouveaux liens générés par Url.Action
, etc.
Le paramètre de requête permet également de débogage locale avec Visual Studio 2013, sans avoir à configurer avec netsh ou exécuter en tant qu'Administrateur. Par défaut, IIS Express ne lie localhost lorsque la non-élevée; il ne se lient pas à la synonymes de noms d'hôtes comme sous.localtest.moi.
class SubdomainRoute : Route
{
public SubdomainRoute(string url) : base(url, new MvcRouteHandler()) {}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var routeData = base.GetRouteData(httpContext);
if (routeData == null) return null; // Only look at the subdomain if this route matches in the first place.
string subdomain = httpContext.Request.Params["subdomain"]; // A subdomain specified as a query parameter takes precedence over the hostname.
if (subdomain == null) {
string host = httpContext.Request.Headers["Host"];
int index = host.IndexOf('.');
if (index >= 0)
subdomain = host.Substring(0, index);
}
if (subdomain != null)
routeData.Values["subdomain"] = subdomain;
return routeData;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
object subdomainParam = requestContext.HttpContext.Request.Params["subdomain"];
if (subdomainParam != null)
values["subdomain"] = subdomainParam;
return base.GetVirtualPath(requestContext, values);
}
}
Pour plus de commodité, appeler le MapSubdomainRoute
méthode de votre RegisterRoutes
méthode, comme vous le feriez plaine vieux - MapRoute
:
static void MapSubdomainRoute(this RouteCollection routes, string name, string url, object defaults = null, object constraints = null)
{
routes.Add(name, new SubdomainRoute(url) {
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints),
DataTokens = new RouteValueDictionary()
});
}
Enfin, pour accéder facilement aux sous-domaine (que ce soit à partir d'un vrai sous-domaine ou un paramètre de requête), il est utile de créer un Contrôleur de la classe de base avec cette Subdomain
de la propriété:
protected string Subdomain
{
get { return (string)Request.RequestContext.RouteData.Values["subdomain"]; }
}