ASP.NET子域url重写和url生成

时间:2011-11-21 14:45:49

标签: c# asp.net-mvc asp.net-mvc-3

有没有办法在区域中使用子域名,在ASP.NET MVC中真的可行吗?

我看到了许多不同的方法,但它们都没有完全使用ASP.NET MVC基础结构:

a)使用RouteConstraint(如MVC 3 Subdomain Routing) - 它可以帮助asp.net mvc选择正确的路线,但不解决网址生成问题

b)定义自定义路由类:http://blog.tonywilliams.me.uk/asp-net-mvc-2-routing-subdomains-to-areashttp://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx,两者都有url生成问题(第二个提供HtmlHelper.ActioLink扩展作为解决方案,但这只是所需内容的一小部分 - url是使用Html.BeginForm,Ajax.BeginForm,Url.Action等构建的 - 对现有代码库的过多更改+没有人会保证,新手不会忘记使用正确的扩展+不确定是否适用于T4MVC )。

c)使用网址重写规则:

 <rules>
    <rule name="SubDomain" stopProcessing="false">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^(?!www)(\w+)\.domain\.com$" />
      </conditions>
      <action type="Rewrite" url="{C:1}/{R:1}" />
    </rule>
  </rules>

因此,如果用户请求admin.domain.com,asp.net mvc了解domain.com/admin。 到目前为止一切都很好,问题就在于此(我实际上是在使用T4MVC,但这里有没有它的例子,不要吓唬那些从未使用它的人):

<a href="@Url.Action("Index", "Home")">

这个,根据我的路由应该去domain.com,但它给出异常“不能使用前导..退出顶层目录”。

我想是这样的,因为UrlAction尝试使用当前网址(重写后是domain.com/admin)构建网址,这会导致失败。另外我认为这只是一种方式 - 只是为了找到正确的区域/控制器/动作,而不是用于生成正确的URL。

所以问题是,有没有人双向完成(我的意思是路由到正确的区域/控制器/动作并使用标准助手生成URL,如HtmlHelper,UrlHelper)?

1 个答案:

答案 0 :(得分:0)

首先你需要进行DNS设置。

在下面的global.asax中编写代码

 public class SubdomainRoute : Route
{
    public SubdomainRoute(string url, object defaults)
        : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    { }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        var tokens = httpContext.Request.Url.Host.Split('.');
        if (tokens.Length > 1)
        {
            rd.Values["username"] = tokens[0];

        }
        return rd;
    }
}