Verwenden Sie die folgende von abgeleitete Klasse, um die Subdomain unter Beibehaltung der Standard-MVC5-Routingfunktionen zu erfassen .SubdomainRoute
Route
Darüber hinaus SubdomainRoute
ermöglicht es die Sub - Domain optional als angegeben werden Abfrageparameter , was sub.example.com/foo/bar
und example.com/foo/bar?subdomain=sub
gleichwertig. 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.Action
usw. 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 RegisterRoutes
Methode 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 Subdomain
Eigenschaft zu erstellen :
protected string Subdomain
{
get { return (string)Request.RequestContext.RouteData.Values["subdomain"]; }
}