Untuk menangkap subdomain sambil mempertahankan fitur perutean MVC5 standar , gunakan SubdomainRoutekelas berikut yang berasal dari Route.
Selain itu, SubdomainRoutememungkinkan subdomain secara opsional ditetapkan sebagai parameter kueri , pembuatan, sub.example.com/foo/bardan yang example.com/foo/bar?subdomain=subsetara. Ini memungkinkan Anda untuk menguji sebelum subdomain DNS dikonfigurasi. Parameter kueri (saat digunakan) diperbanyak melalui tautan baru yang dihasilkan oleh Url.Action, dll.
Parameter kueri juga memungkinkan debugging lokal dengan Visual Studio 2013 tanpa harus mengkonfigurasi dengan netsh atau dijalankan sebagai Administrator . Secara default, IIS Express hanya mengikat ke localhost ketika tidak ditinggikan; itu tidak akan mengikat nama host yang sama seperti sub.localtest.me .
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);
}
}
Untuk kenyamanan, panggil MapSubdomainRoutemetode berikut dari RegisterRoutesmetode Anda seperti yang biasa Anda lakukan 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()
});
}
Akhirnya, untuk mengakses subdomain dengan mudah (baik dari subdomain asli atau parameter kueri), akan sangat membantu untuk membuat kelas dasar Pengontrol dengan Subdomainproperti ini :
protected string Subdomain
{
get { return (string)Request.RequestContext.RouteData.Values["subdomain"]; }
}