ASP.NET MVC 2 アプリケーション内のエリアを次のようなサブドメインにマップする方法はありますか?
movies.example.com/Theater/View/2
それ以外の
example.com/Movies/Theater/View/2
where { area = "Movies", controller = "Theater", action = "View", id = 2 }.
ASP.NET MVC 2 アプリケーション内のエリアを次のようなサブドメインにマップする方法はありますか?
movies.example.com/Theater/View/2
それ以外の
example.com/Movies/Theater/View/2
where { area = "Movies", controller = "Theater", action = "View", id = 2 }.
エリアはルーティングとは直接関係ないので、「ルーティングはサブドメインをサポートしていますか?」という質問になります。
残念ながら、これに対する組み込みのサポートはありません。
ただし、良いニュースは、多くの人がルーティングの上に構築されたカスタム コードを試して成功したことです。
エリアなしでサブドメインをルーティングする方法を理解すれば、エリアでそれを行うことは難しくありません。エリア登録コンテキストに移動し、そこで選択したテクニックを使用してください。領域は、コントローラーとビューをグループ化するための手段にすぎません。ASP.NET MVC 自体にとって本質的な意味はあまりありません (多少は機能しますが、多くはありません)。
IIS7 URL 書き換えモジュールを使用して、ドメインまたはサブドメインを MVC2 エリアに簡単にマップできます。サブドメインを 2 つのエリアにマップする 2 つの単純なルールを次に示します。リクエストが実際のファイル (つまり、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>
特定のユースケースに対応するには、以下のルールを変更する必要があります。特に、使用する必要があるルート領域にコントローラーがある場合。その場合は、条件を追加するか、新しいルールを作成してください。
IIS URL 書き換えモジュールをダウンロードします (必須): http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/
私は同じ問題に遭遇し、私にとってはうまくいく解決策を構築しました。それは私のブログにあります。
乾杯トニー
他のスレッドで言及されている多くの解決策を試しましたが、物事が非常に複雑になりすぎることがわかりました。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);
}
}
これは明らかにかなりのハックですが、結果として非常にシンプルになったことに本当に満足しています。
サブドメインをエリアに動的にマッピングするようにこのコードを簡単に微調整することはできますが、私は 2 つのエリアしか持っていないので、各エリアを個別に登録するだけです。さらに、これにより、各エリア内で異なるルーティングを自由に行うことができます。