Để nắm bắt tên miền phụ trong khi vẫn giữ các tính năng định tuyến MVC5 tiêu chuẩn , hãy sử dụng SubdomainRoute
lớp sau có nguồn gốc từ Route
.
Ngoài ra, SubdomainRoute
cho phép tùy chọn tên miền phụ làm tham số truy vấn , tạo sub.example.com/foo/bar
và example.com/foo/bar?subdomain=sub
tương đương. Điều này cho phép bạn kiểm tra trước khi tên miền phụ DNS được định cấu hình. Tham số truy vấn (khi sử dụng) được truyền qua các liên kết mới được tạo bởiUrl.Action
, v.v.
Tham số truy vấn cũng cho phép gỡ lỗi cục bộ với Visual Studio 2013 mà không phải cấu hình với Netsh hoặc chạy với tư cách Quản trị viên . Theo mặc định, IIS Express chỉ liên kết với localhost khi không nâng cao; nó sẽ không liên kết với các tên máy chủ đồng nghĩa như 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);
}
}
Để thuận tiện, hãy gọi MapSubdomainRoute
phương thức sau từ RegisterRoutes
phương thức của bạn giống như bạn thường sử dụng 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()
});
}
Cuối cùng, để truy cập thuận tiện tên miền phụ (từ tên miền phụ thực hoặc tham số truy vấn), sẽ hữu ích khi tạo lớp cơ sở Bộ điều khiển với thuộc Subdomain
tính này:
protected string Subdomain
{
get { return (string)Request.RequestContext.RouteData.Values["subdomain"]; }
}