Есть ли способ сопоставить области в приложении ASP.NET MVC 2 с субдоменами, такими как
movies.example.com/Theater/View/2
вместо
example.com/Movies/Theater/View/2
где {area = "Movies", controller = "Theatre", action = "View", id = 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}.
Районы не имеют прямого отношения к маршрутизации, поэтому ваш вопрос становится "поддерживает ли поддомены поддержки маршрутизации?"
Ответ на этот вопрос, к сожалению, не содержит встроенной поддержки.
Однако хорошей новостью является то, что многие люди пробовали и нашли успех с настраиваемым кодом, который строится поверх маршрутизации:
Если вы выясните, как направлять субдомены без областей, то делать это с областями не должно быть сложнее. Перейдите в контекст регистрации области и используйте любую технику, которую вы выберете внутри. Области - это всего лишь способ группировать контроллеры и представления - они не имеют очень существенного значения для самого ASP.NET MVC (они делают немного, но не много).
Вы можете легко сопоставлять домены или поддомены в области 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/
Я столкнулся с той же проблемой, и я построил решение, которое сработало для меня, это в моем blog, надеюсь, это будут вам полезны.
Приветствия Тони
Я пробовал много решений, упомянутых в других потоках, и обнаружил, что вещи становятся слишком сложными очень быстро. Похоже, что 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 этот код, чтобы динамически отображать субдомен в область, но у меня есть только две области, поэтому я просто регистрирую каждую область отдельно. Плюс это дает мне свободу иметь разную маршрутизацию внутри каждой области.