Перезапись URL субдоменов ASP.NET и генерация URL - PullRequest
2 голосов
/ 21 ноября 2011

Есть ли способ использовать субдомены для областей, которые в ASP.NET MVC действительно будут работать?

Я видел много разных подходов, но ни один из них не полностью работает с инфраструктурой ASP.NET MVC:

a) использовать RouteConstraint (например, MVC 3 Subdomain Routing ) - это помогает asp.net mvc выбрать правильный маршрут, но не решает проблему генерации URL

b) определение пользовательского класса маршрута: http://blog.tonywilliams.me.uk/asp-net-mvc-2-routing-subdomains-to-areas или http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx, у обоих есть проблемы с генерацией URL (второй предоставляет расширение HtmlHelper.ActioLink в качестве решения, но это только часть того, что необходимо - URL создаются с использованием Html.BeginForm, Ajax.BeginForm, Url.Action и т. д. - слишком много изменений в существующей кодовой базе + никто не гарантирует, что новичок не забудет использовать правильное расширение + не уверен, будет ли это работать с T4MVC).

в) с использованием правила перезаписи URL:

 <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 пытается создать URL, используя текущий URL (который является domain.com/admin после перезаписи), и это приводит к сбою. Также я думаю, что это только один способ - просто найти правильную область / контроллер / действие, но не генерировать правильные URL.

Итак, вопрос в том, кто-нибудь делал это обоими способами (я имею в виду маршрутизацию в нужную область / контроллер / действие и генерирование URL-адресов с использованием стандартных помощников, таких как HtmlHelper, UrlHelper)?

1 Ответ

0 голосов
/ 05 декабря 2011

1-й, вам нужно настроить 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...