我正在寻找创建一个 MVC3 网站。我们至少需要两个区域,但每个区域都需要不同的 url。像这样:
domain.com/ 转到 /
admin.domain.com/ 转到 /areas/admin
anotherSite.com/ 转到 /areas/portal
在做了一些研究之后,我发现了Lucero 的链接,您可以使用 HostNameContraint,如下所示:
public class HostNameContraint : IRouteConstraint
{
protected string _hostname;
public HostNameContraint(string hostname)
{
_hostname = hostname;
}
bool IRouteConstraint.Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (httpContext.Request.Url.Host == _hostname)
return true;
return false;
}
}
然后像这样注册约束:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { hostname = new HostNameContraint("domain.com") },
new[] { "MVCProject.Controllers" }
);
routes.MapRoute(
"Admin_Default2", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { hostname = new HostNameContraint("admin.domain.com") },
new[] { "MVCProject.Controllers.Areas.Admin.Controllers" }
);
routes.MapRoute(
"Portal_Default2", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { area = "Portal", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { hostname = new HostNameContraint("anotherSite.com") },
new[] { "MVCProject.Controllers.Areas.Portal.Controllers" }
);
我有 IIS 设置,以便它们指向每个站点的应用程序的根文件夹。指向根“Domain.com”可以正常工作,但转到“Admin.domain.com”或“Domain.com/admin/”会出现 404“找不到资源”。
更新 我已经尝试过在网址开头使用区域名称和不使用区域名称。
“门户/{controller}/{action}/{id}”
问题是当“门户”区域在路由中时,签名与“anotherSite.com”的名称不匹配,因此它会返回并显示 403.14 - Forbidden。无法列出此目录的内容。同样重要的是要注意,当“门户”区域为 url 参数时,永远不会调用 HostNameConstraint 的构造函数。