我希望创建一个MVC3网站。我们至少需要两个区域,但我们需要为每个区域提供不同的网址。像这样:
domain.com/转到/
admin.domain.com/转到/ areas / admin
anotherSite.com/转到/ areas / portal
在做了一些研究后,我发现Lucero's link可以使用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“资源无法找到。”
更新 我已经尝试了它与网址开头的区域名称和没有。
“门户/ {控制器} / {行动} /(编号)”
问题是当“门户”区域在路线中时,签名与名称“anotherSite.com”不匹配,因此它返回并说403.14 - 禁止。无法列出此目录的内容。同样重要的是要注意,当“Portal”区域是url参数时,永远不会调用HostNameConstraint的构造函数。
答案 0 :(得分:0)
为了表明将URL区分为某个区域,区域名称必须是URL的一部分。否则,该区域将无法从URL解析,您将回退到默认路由。此外,最好将默认路由放在最后 - 以确保测试所有其他路由映射
请注意在相应的MapRoute调用中添加“Admin /”和“Portal /”:
routes.MapRoute(
"Admin_Default2", // Route name
"Admin/{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
"Portal/{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" }
);
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" }
);