2011-02-04 3 views
7

私はWCFで簡単なREST APIを書いており、認証メカニズムはAPIキーを使用しています。クライアントがリクエストヘッダ内のAPIキーを送信すると、以下のように、私は(BaseServiceクラスでRequestInterceptorクラスののprocessRequest()メソッドをオーバーライド)サーバー側でそれを確認してください。WCFのHttpContext

public partial class BaseService : RequestInterceptor 
{ 
    public BaseService() : base(false) { } 

    #region Process Request 
    public override void ProcessRequest(ref RequestContext requestContext) 
    { 
     if (IsValidApiKey(requestContext)) 
      //put some values in HttpContext object. 

    } 

を...

これでRESTサービスでaspnet互換性を有効にしましたが、上記のProcessRequestオーバーライドでHttpContextオブジェクトにアクセスできません。 HttpContextにはServiceメソッド内からアクセスできますが、ProcessRequestメソッドではアクセスできないことに注意してください。

なぜでしょうか?

答えて

1

私は、次のコードを追加することによって、私の問題を解決した:

private HttpContext _httpContext; 
public BaseService() 
     : base(true) 
    { 
     _httpContext = HttpContext.Current;    

    } 

これを実行した後、私はprocessRequestメソッドでのHttpContextオブジェクトにアクセスすることができています。

1

HttpContextはおそらくWCFチャネルスタックの後半で初期化されます。チャンネルインターセプタは、何よりも先にチャンネルスタックで実行され、Httpチャンネルリスナからメッセージが受信された直後に実行されることに注意してください。リクエストインターセプタからHttpContextにアクセスするには、何が必要ですか? Http Requestは、requestContextに関連付けられたメッセージのプロパティとして使用できます。また、メッセージに使用できるプロパティバッグにいくつかの値を保存することもできます。

ありがとう パブロ

1

ただし、HttpContext.Currentはスレッドセーフではなく、1つのスレッドで設定されているものは別のスレッドによって変更される可能性があることに注意してください。

たとえば、2つのリクエストがあなたのサービスに送られます。最初の要求に対して、RequestInterceptorのHttpContextに値を設定します。 2番目の要求は、最初の要求がRequestInterceptorsで終了しなくなるまで待機します。最初の要求がRequestInterceptorsで終了し、サービスに渡された場合、2番目の要求はRequestInterceptorsに入り、最初の要求が完了していない場合は最初の要求によって設定されたHttpContextにアクセスできます。それは私が遭遇した問題の一種です。