Verwenden Sie die folgende von abgeleitete Klasse, um die Subdomain unter Beibehaltung der Standard-MVC5-Routingfunktionen zu erfassen .SubdomainRouteRoute
Darüber hinaus SubdomainRouteermöglicht es die Sub - Domain optional als angegeben werden Abfrageparameter , was sub.example.com/foo/barund example.com/foo/bar?subdomain=subgleichwertig. Auf diese Weise können Sie testen, bevor die DNS-Subdomänen konfiguriert werden. Der Abfrageparameter (wenn verwendet) wird über neue Links weitergegeben, die von Url.Actionusw. generiert wurden.
Der Abfrageparameter ermöglicht auch das lokale Debuggen mit Visual Studio 2013, ohne mit netsh konfigurieren oder als Administrator ausgeführt werden zu müssen . Standardmäßig bindet IIS Express nur dann an localhost, wenn es nicht erhöht ist. es wird auch nicht an hostnamen wie gebunden sub.localtest.me gebunden .
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);
}
}
Rufen Sie zur Vereinfachung Folgendes an MapSubdomainRoute Methode aus Ihrer RegisterRoutesMethode auf, so wie Sie es einfach alt machen würden 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()
});
}
Um bequem auf die Subdomain zugreifen zu können (entweder über eine echte Subdomain oder einen Abfrageparameter), ist es hilfreich, eine Controller-Basisklasse mit dieser SubdomainEigenschaft zu erstellen :
protected string Subdomain
{
get { return (string)Request.RequestContext.RouteData.Values["subdomain"]; }
}