Подтвердить что ты не робот

Области Can в приложении ASP.NET MVC 2 к поддомену?

Есть ли способ сопоставить области в приложении ASP.NET MVC 2 с субдоменами, такими как

movies.example.com/Theater/View/2

вместо

example.com/Movies/Theater/View/2

где {area = "Movies", controller = "Theatre", action = "View", id = 2}.

4b9b3361

Ответ 1

Районы не имеют прямого отношения к маршрутизации, поэтому ваш вопрос становится "поддерживает ли поддомены поддержки маршрутизации?"

Ответ на этот вопрос, к сожалению, не содержит встроенной поддержки.

Однако хорошей новостью является то, что многие люди пробовали и нашли успех с настраиваемым кодом, который строится поверх маршрутизации:

Если вы выясните, как направлять субдомены без областей, то делать это с областями не должно быть сложнее. Перейдите в контекст регистрации области и используйте любую технику, которую вы выберете внутри. Области - это всего лишь способ группировать контроллеры и представления - они не имеют очень существенного значения для самого ASP.NET MVC (они делают немного, но не много).

Ответ 2

Вы можете легко сопоставлять домены или поддомены в области MVC2 с помощью модуля перезаписи URL-адреса IIS7. Вот два простых правила, которые отображают субдомены в две области. Я добавил ограничение, чтобы не использовать это правило, если запрос предназначен для фактического файла (т.е. 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>

Вам нужно будет изменить приведенные ниже правила, чтобы работать с вашим конкретным вариантом использования. Особенно, если у вас есть контроллеры на корневой области, которые вам нужно использовать. В этом случае просто добавьте условие или создайте новое правило.

Загрузите модуль перезаписи URL-адреса IIS (обязательно): http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/

Ответ 3

Я столкнулся с той же проблемой, и я построил решение, которое сработало для меня, это в моем blog, надеюсь, это будут вам полезны.

Приветствия Тони

Ответ 4

Я пробовал много решений, упомянутых в других потоках, и обнаружил, что вещи становятся слишком сложными очень быстро. Похоже, что 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);
    }
}

Это, очевидно, довольно хак, но я действительно доволен тем, насколько просто это закончилось.

Вы можете легко tweek этот код, чтобы динамически отображать субдомен в область, но у меня есть только две области, поэтому я просто регистрирую каждую область отдельно. Плюс это дает мне свободу иметь разную маршрутизацию внутри каждой области.