2

そのため、MVC 4 を使用して最初の Web API を構築しようとしています。すべてうまくいっています。自分のサイトで基本認証を (SSL を使用して) 動作させることができましたが、問題があります。

すべての ApiController に次の小さなコードがあります。

    private Profile user
    {
        get
        {                
            var UserId = Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString();
            var Profile = new Profile(UserId);
            return Profile;
        }
    }

これを行うのは、カスタム プロファイルに追加のフィールドがいくつかあるためです。つまり、CompanyId です。私の関数はすべて、データを取得するためにこの CompanyId を必要とします。CompanyId をトークンとして使用することを考えていましたが、それを機能させることができませんでした:D

私の質問は次のとおりです。各リクエストの CompanyId をグローバルに保存する方法はありますか? おそらく、ルート メッセージ ハンドラーへのフィルターで。APIはステートレスであるため、セッションなどを使用できないことはわかっていますが、一方で、常に繰り返しコードを使用したくない....

4

2 に答える 2

1

@Alon で言及されているオプション以外に、次のようDependency Injection(DI)な DI コンテナーを確認することを強くお勧めしますAutofac。DI を使用すると、この場合のような依存関係Profileを API コントローラーにプッシュしたり、実際にはプロファイルを必要とする任意のクラスにプッシュしたりできます。

コンストラクター注入は推奨されるメカニズムであるため、クラス シグネチャは次のようになります。

public class Class1 {
    public Profile CurrentUserProfile { get;private set;}

    public Class1(Profile profile){
       this.CurrentUserProfile=profile;   // Now you can use it throughout the class.
    }
}

このような依存関係を BaseApiController などの基本クラスに挿入できます。

Autofac 登録は次のようになります。

builder.Register<Gateway.IRequestContextBuilder>((c) =>
{
            var UserId = Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString();
            var Profile = new Profile(UserId);
            return Profile;

}).InstancePerHttpRequest();

これにより、HTTP リクエストごとに 1 回 Profile オブジェクトが作成され、それを任意の依存クラスに注入できます。

これは混乱を招くように思えるかもしれませんが、DI の概念と Autofac のようなコンテナーを理解すれば、これはより理にかなっています。

于 2013-03-09T13:47:52.200 に答える
1

次の 2 つのオプションがあります。

  1. (より単純なもの) ページ処理イベント (Global.asax 内) の 1 つを使用して、プロファイル情報を取得し、HttpContext に格納します。
  2. 同じことを行う独自の HttpModule を作成します (プロファイルを取得して HttpContext に保存します)。

API メソッドから HttpContext にアクセスできます。最初のオプションの方がはるかに簡単なので、最初のオプションを使用します。

于 2013-03-09T11:29:18.307 に答える