mvc3区域有主机名

时间:2012-10-22 18:02:57

标签: asp.net-mvc-3 iis asp.net-mvc-routing asp.net-mvc-areas

我希望创建一个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的构造函数。

1 个答案:

答案 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" }
    );