2

MVC3 Web サイトを作成しようとしています。少なくとも 2 つのエリアが必要ですが、エリアごとに異なる URL が必要です。このような:

domain.com/ は / に移動します

admin.domain.com/ は /areas/admin に移動します

anotherSite.com/ は /areas/portal に移動します

いくつかの調査を行った後、次のように HostNameContraint を使用できるというLucero のリンクを見つけました。

public class HostNameContraint : IRouteConstraint
{
    protected string _hostname;

    public HostNameContraint(string hostname)
    {
        _hostname = hostname;
    }

    bool IRouteConstraint.Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (httpContext.Request.Url.Host == _hostname)
            return true;
        return false;
    }
}

次に、次のように制約を登録します。

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { hostname = new HostNameContraint("domain.com") },
            new[] { "MVCProject.Controllers" }
        );

        routes.MapRoute(
            "Admin_Default2", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { hostname = new HostNameContraint("admin.domain.com") },
            new[] { "MVCProject.Controllers.Areas.Admin.Controllers" }
        );

        routes.MapRoute(
            "Portal_Default2", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { area = "Portal", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { hostname = new HostNameContraint("anotherSite.com") },
            new[] { "MVCProject.Controllers.Areas.Portal.Controllers" }
        );

各サイトのアプリケーションのルート フォルダーを指すように IIS をセットアップしました。ルート "Domain.com" を指定すると問題なく動作しますが、"Admin.domain.com" または "Domain.com/admin/" に移動すると、404 "リソースが見つかりません" が表示されます。

更新 URLの先頭にエリア名がある場合とない場合の両方で試しました。

"ポータル/{コントローラー}/{アクション}/{id}"

問題は、「Portal」エリアがルートにある場合、署名が「anotherSite.com」の名前と一致しないため、返されて 403.14 - Forbidden と表示されることです。このディレクトリの内容を一覧表示できません。「Portal」領域が url パラメータの場合、HostNameConstraint のコンストラクタは呼び出されないことに注意することも重要です。

4

1 に答える 1

0

URL が特定のエリアに移動していることを示すには、エリア名が URL の一部である必要があります。そうしないと、そのエリアは URL から解析できず、デフォルトのルーティングにフォールバックします。また、他のすべてのルート マッピングが確実にテストされるように、デフォルト ルートを最後に配置することをお勧めします。

対応する MapRoute 呼び出しに「Admin/」と「Portal/」が追加されていることに注意してください。

    routes.MapRoute(
        "Admin_Default2", // Route name
        "Admin/{controller}/{action}/{id}", // URL with parameters
        new { area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
        new { hostname = new HostNameContraint("admin.domain.com") },
        new[] { "MVCProject.Controllers.Areas.Admin.Controllers" }
    );

    routes.MapRoute(
        "Portal_Default2", // Route name
        "Portal/{controller}/{action}/{id}", // URL with parameters
        new { area = "Portal", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
        new { hostname = new HostNameContraint("anotherSite.com") },
        new[] { "MVCProject.Controllers.Areas.Portal.Controllers" }
    );

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
        new { hostname = new HostNameContraint("domain.com") },
        new[] { "MVCProject.Controllers" }
    );
于 2012-10-22T20:39:21.463 に答える