有没有办法将 ASP.NET MVC 2 应用程序中的区域映射到子域,例如
movies.example.com/Theater/View/2
代替
example.com/Movies/Theater/View/2
其中{区域=“电影”,控制器=“剧院”,动作=“视图”,id = 2}。
有没有办法将 ASP.NET MVC 2 应用程序中的区域映射到子域,例如
movies.example.com/Theater/View/2
代替
example.com/Movies/Theater/View/2
其中{区域=“电影”,控制器=“剧院”,动作=“视图”,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>
您必须更改以下规则才能使用您的特定用例。特别是如果您在需要使用的根区域上有控制器。在这种情况下,只需添加条件或创建新规则。
下载 IIS URL 重写模块(必需): http ://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/
我遇到了同样的问题,我已经建立了一个对我有用的解决方案,它在我的博客中,希望它对你有用。
干杯托尼
我尝试了很多其他线程上提到的解决方案,发现事情很快变得太复杂了。似乎 ASP.Net MVC 希望您对 Route 进行子类化以执行这种高级路由,但它似乎对我不起作用。我永远无法将域映射到命名空间,因此我遇到了“模糊控制器”异常(因为我在两个命名空间中都有一个主控制器)。
最终,我使用约束将子域指向命名空间。
这是我的路线的样子。请注意,这条路线是针对“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);
}
}
这显然是一个 hack,但我真的很高兴它最终变得如此简单。
您可以轻松地使用此代码将子域动态映射到一个区域,但我只有两个区域,所以我只是分别注册每个区域。另外,这让我可以自由地在每个区域内使用不同的路由。