Могут ли области в приложении ASP.NET MVC 2 отображаться на поддомен? - PullRequest
19 голосов
/ 12 января 2010

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

movies.example.com/Theater/View/2

вместо

example.com/Movies/Theater/View/2

где {area = "Фильмы", контроллер = "Театр", action = "Вид", id = 2}.

Ответы [ 4 ]

11 голосов
/ 12 января 2010

Области не имеют прямого отношения к маршрутизации, поэтому ваш вопрос звучит так: «Поддерживает ли субдомен маршрутизации?»

К сожалению, ответ на этот вопрос заключается в том, что для этого нет встроенной поддержки.

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

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

5 голосов
/ 29 июня 2010

Вы можете легко сопоставить домены или субдомены с областью 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 голосов
/ 15 июля 2010

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

Приветствие Tony

1 голос
/ 24 февраля 2011

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

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

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

...