0

HTTPS(.NET 4.5)でWCFカスタムバリデーターを使用しています。成功時に検証すると、後で使用したいCustomerオブジェクトが返されます。現在、可能であれば避けたい静的変数を使用してそれを行うことができます。メインスレッドでnullになるHttpContextを使おうとしました。私の理解では、 Validateは別のスレッドで実行されます。DBやファイル共有を使わずにセッション情報を共有する方法はありますか?ここここの関連スレッドを参照してください。

Authentication.csで

public class CustomValidator : UserNamePasswordValidator
{ 
      public override void Validate(string userName, string password)
      {
       //If User Valid then set Customer object
      }
}

Service.csで

  public class Service
  {
      public string SaveData(string XML)
      {
       //Need Customer object here. Without it cannot save XML. 
       //HttpContext null here.
      }
  }  
4

2 に答える 2

1

別のアプローチを提案できます。WCFサービスがASP.Net互換モードで実行されており、顧客オブジェクトをセッションストレージに保存していると仮定します。次のようなクラスを作成しますAppContext

コードは次のようになります

public class AppContext {
public Customer CurrentCustomer {
  get {
    Customer cachedCustomerDetails = HttpContext.Current.Session[CUSTOMERSESSIONKEY] as Customer;
        if (cachedCustomerDetails != null)
        {
            return cachedCustomerDetails;
        }
        else
        {
            lock (lockObject)
            {
                if (HttpContext.Current.Session[CUSTOMERSESSIONKEY] != null)        //Thread double entry safeguard
                {
                    return HttpContext.Current.Session[CUSTOMERSESSIONKEY] as Customer;
                }

                Customer CustomerDetails = ;//Load customer details based on Logged in user using HttpContext.Current.User.Identity.Name
                if (CustomerDetails != null)
                {
                    HttpContext.Current.Session[CUSTOMERSESSIONKEY] = CustomerDetails;
                }

                return CustomerDetails;
            }
        }
  }
}

ここでの基本的な考え方は、WCFパイプラインとASP.Netパイプラインの両方が実行され、HTTPContextが使用可能な場合に、データの遅延読み込みを行うことです。

それが役に立てば幸い。

于 2013-02-27T08:43:45.177 に答える
0

よし、これはもっと簡単だったはずです。UserNamePasswordValidator の動作方法から、カスタム認証を使用して UserName/Password をメイン スレッドに渡し、データベースから顧客情報を再度取得する必要がありました。これは追加の DB 呼び出しですが、現時点では許容できる回避策です。Rory Primrose の天才ブログ エントリからコードをダウンロードしてください。

于 2013-03-06T00:02:18.210 に答える