ASP.NET MVC 2应用程序中的区域可以映射到子域吗?

时间:2010-01-12 06:29:30

标签: asp.net asp.net-mvc subdomain asp.net-mvc-routing asp.net-mvc-areas

有没有办法将ASP.NET MVC 2应用程序中的区域映射到子域,例如

movies.example.com/Theater/View/2

而不是

example.com/Movies/Theater/View/2

其中{area =“Movies”,controller =“Theatre”,action =“View”,id = 2}。

4 个答案:

答案 0 :(得分:11)

区域与路由没有直接关系,因此您的问题变为“路由支持子域名吗?”

遗憾的是,对此没有内置支持。

然而,好消息是许多人尝试使用基于路由的自定义代码取得成功:

如果你弄清楚如何在没有区域的情况下路由子域,那么对区域进行操作应该不会更困难。转到您的区域注册环境,并使用您在其中选择的任何技术。区域只是将控制器和视图组合在一起的一种方式 - 它们对ASP.NET MVC本身没有太多内在意义(它们有一点点,但不是很多)。

答案 1 :(得分:5)

您可以使用IIS7 URL重写模块轻松地将域或子域映射到MVC2区域。以下是将子域映射到两个区域的两个简单规则。如果请求是针对实际文件(即CSS,JS或图像文件),我添加了不使用此规则的限制。

以下是web.config中的示例配置:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SubA Area">
                <match url=".*" />
                <action type="Rewrite" url="/SubA/{R:0}" />
                <conditions>
                    <add input="{HTTP_HOST}" pattern="suba.mydomain.com" />
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                </conditions>
            </rule>
            <rule name="SubB Area">
                <match url=".*" />
                <conditions>
                    <add input="{HTTP_HOST}" pattern="subb.mydomain.com" />
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                </conditions>
                <action type="Rewrite" url="/SubB/{R:0}" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

您必须更改以下规则才能使用您的特定用例。特别是如果您需要在根区域使用控制器。在这种情况下,只需添加条件或创建新规则。

下载IIS URL重写模块(必需): http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/

答案 2 :(得分:3)

我遇到了同样的问题,我已经构建了一个适合我的解决方案,它位于我的blog中,希望它对你有用。

干杯 贝

答案 3 :(得分:1)

我尝试了很多其他线程上提到的解决方案,发现事情变得非常复杂。似乎ASP.Net MVC希望你将子类路由到这种高级路由,但它似乎永远不适合我。我从来没有能够将域映射到命名空间,所以我结束了“模糊控制器”异常(因为我在两个命名空间中都有一个家庭控制器)。

最终,我使用约束将子域指向名称空间。

这是我的路线的样子。请注意,此路由适用于“api”。子域:

        context.MapRoute(
            "Api_Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new { controller = new SubdomainRouteConstraint("api.") },
            new[] { "BendyTree.CloudSpark.Areas.Api.Controllers" }
            );

这是上面引用的“SubdomainRouteConstraint”类:

public class SubdomainRouteConstraint : IRouteConstraint
{
    private readonly string SubdomainWithDot;

    public SubdomainRouteConstraint(string subdomainWithDot)
    {
        SubdomainWithDot = subdomainWithDot;
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return new Regex("^https?://" + SubdomainWithDot).IsMatch(httpContext.Request.Url.AbsoluteUri);
    }
}

这显然是一个非常黑客,但我真的很高兴它最终变得多么简单。

您可以轻松调整此代码以将子域动态映射到某个区域,但我只有两个区域,所以我只是单独注册每个区域。此外,这使我可以自由地在每个区域内进行不同的路由。