web-dev-qa-db-ja.com

MVC3サブドメインルーティング

重複の可能性:
サブドメインに基づいてASP.NET MVCルートを作成することは可能ですか?

Asp.net MVC 3サイトで、ユーザー向けのオンラインストアを作成したいと思います。ユーザーが作成するストアには、 "shopname。mydomain.com"のようなURLが必要です。

ルーティング作業を試しましたが、まったく失敗しました。解決策を探していますが、適切な解決策が見つかりません。

私の目的はそれです。サブドメインを見つけようとするリクエストを管理するためのルートを追加できる場合は、それがユーザーのオンラインショップ名であるかどうかを確認し、動的データを取得します。

ルーティングのヘルプが必要です:)ありがとう。

28

私は非常に強力な方法を見つけました。だからこれをチェックしてください:)

まず、Visual Studioのアプリケーション開発サーバーでは、「hosts」ファイルを編集する必要があります。

管理者としてメモ帳を開きます。ドメインに次のような名前を追加します

127.0.0.1 mydomain.com 127.0.0.1 sub1.mydomain.com

そして、開発で使用する必要があるもの。

Webプロジェクトに特定のポート番号を指定した後。たとえば、「45499」。このようにして、ブラウザに書き込むことでプロジェクトへのリクエストを感知できるようになります。

mydomain.com:45499またはsub1.mydomain.com:45499

それが準備段階でした。答えを出しましょう。

IRouteConstraintクラスを使用すると、ルート制約を作成できます。

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)
    {
        var url = httpContext.Request.Headers["Host"];
        var index = url.IndexOf(".");

        if (index < 0)
        {
            return false;
        }
        //This will bi not enough in real web. Because the domain names will end with ".com",".net"
        //so probably there will be a "." in url.So check if the sub is not "yourdomainname" or "www" at runtime.
        var sub = url.Split('.')[0];
        if(sub == "www" || sub == "yourdomainname" || sub == "mail")
        {
            return false;
        }

        //Add a custom parameter named "user". Anything you like :)
        values.Add("user", );
        return true;
    }
}

そして、使用したいルートに制約を追加します。

routes.MapRoute(
                    "Sub", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "SubdomainController", action = "AnyActionYouLike", id = UrlParameter.Optional },
                    new { controller = new SubdomainRouteConstraint("abc.") },
                    new[] { "MyProjectNameSpace.Controllers" }
                    ); 

このルートをデフォルトルートの前に置きます。それで全部です。

制約では、サブドメイン名がクライアントショップ名であるかどうかを確認するなどの操作を行うことができます。

17

ルートアプリケーションを指すように*.mydomain.comのDNSエントリを追加する必要があります。次に、ルートアプリケーションでリクエストを処理するときに、リクエストホストをチェックして、指定されているshopnameを特定します。

2
Nick Larsen