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

ASP.NET MVC 2应用程序中的区域是否可以映射到子域?,asp.net,asp.net-mvc,subdomain,asp.net-mvc-routing,asp.net-mvc-areas,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=“Theater”,action=“View”,id=2}。区域与路由没有直接关系,因此您的问题变成“路由是否支持子域?” 不幸的是,对此没有内置的支持 然而,好消息是,许多人已经尝试并成功地使用构建在路由之上的自定义代码:

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

movies.example.com/Theater/View/2

而不是

example.com/Movies/Theater/View/2


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

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

不幸的是,对此没有内置的支持

然而,好消息是,许多人已经尝试并成功地使用构建在路由之上的自定义代码:

  • 还有很多其他的

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

您可以使用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>


我遇到了同样的问题,我已经构建了一个适合我的解决方案,它在我的中,希望它能对您有所帮助

干杯
Tony

我在其他线程上尝试了很多解决方案,发现事情很快变得太复杂了。看起来ASP.NETMVC想让你把路由分为子类来做这种高级路由,但对我来说似乎从来都不起作用。我从未能够将域映射到名称空间,因此我最终遇到了“不明确的控制器”异常(因为我在两个名称空间中都有一个主控制器)

最后,我使用了一个约束将子域指向名称空间

我的路线是这样的。请注意,此路由用于“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);
    }
}
这显然是一个相当简单的技巧,但我真的很高兴它最终变得如此简单


您可以轻松地使用这段代码将子域动态映射到一个区域,但我只有两个区域,所以我只需分别注册每个区域。另外,这让我可以在每个区域内自由选择不同的路线。

@mynameiscoffee,你成功了吗?我有完全相同的任务。不幸的是,我做不到。我有2个家庭控制器-其中一个在子域中。与其他解决方案一样,找到了与名为“主”异常的控制器匹配的多个类型。当我将其重命名为唯一名称时,效果很好。但不清楚如何生成到子域的链接?我试过@Html.RouteLink(“移动”、“api_默认”),但它会生成指向应用程序主页的链接。。。