2017-03-24 16 views
0

私はOWINがホストしているASP.Net WebApi2 Microserviceで作業しています。私たちはAutofacをDependency Injectorとして使用しています。アクセス可能なOwinContext

私のサービスが呼び出されると、私はowinContext.Request.User.Identityにアクセスすることでユーザーに関する情報を取得できます。私の問題は、別のサービスに電話をかけてユーザー情報を渡す必要があるときです。ユーザー情報を含む認証トークンを作成し、そのトークンをRequestMessageに設定する必要があります。

"HttpClient-MessageHandler-Pipline"に配置できるDelegatingHandlerを作成したいと思います。しかし、DelegatingHandler.SendAsync()の内部では、私は現在のOwinContextにアクセスする必要があります。

私はさまざまなアプローチについて考えました。

  1. Autofacで、私は簡単にキャプティブ依存関係の問題を解決することはできません:しかし、私は本当に簡単に何かとエラーが発生しにくい(または多分私はこのアプローチの一つが実現可能にすることができる方法のヒント)があると思いますHttpClientをとしたがって、DelegatingHandlerはSingleInstanceとして登録されます。しかし、OwinContextはLifeTimeScopeに登録されています。ですから、私はOwinContextをDelegatingHandlerのコンストラクタに挿入することはできません。
  2. OwinContextを静的なSystem.Threading.AsyncLocal変数に設定するOwin-Middlewareを書くことができました。 DelegatingHandlerの内部では、その静的変数にアクセスできました。しかし、グローバル変数の変更は本当に間違っています。
  3. 私はDelegatingHandlerを全く書いていません。私のServiceRepository(LifeTimeScopeに登録することもできます)では、すべてのRequestMessagesを手作業で構築する必要があります。それで、RequestMessageにAuthorizationTokenを設定するのは簡単でしょう。しかし、例えば以下のような便利な方法を使用しない。 httpClient.PostAsJsonAsync()は多くの作業を行います。

答えて

0
public class MyHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     return base.SendAsync(request, cancellationToken) 
      .ContinueWith(task => 
       { 
        HttpResponseMessage response = task.Result; 
        IOwinContext owinContext = request.GetOwinContext(); 

        // do something with the response and owinContext 

        return response; 
       }, 
      cancellationToken); 
    } 
} 
+0

ご回答ありがとうございます。私は次のSendAsyncメソッドを書いた: { var owinContextBeforeSend = request.GetOwinContext(); var response = await base.SendAsync(request、cancelationToken); var owinContextAfterSend = request.GetOwinContext(); リターンレスポンス。 } 残念ながら、owinContextBeforeSendとowinContextAfterSendはどちらもnullです。 (そして私はowinContextBeforeSendが必要です) – kryz

+0

このアプローチはおそらく動作しません: "SomeClient ---> MyService ---> SomeOtherService"という3つの関係者が関わっています。 DelegatingHandlerを「サーバ側」に置くこと、すなわちSomeClientからの呼び出しを受信する場合、RequestMessageにはOwinContextが存在します。しかし、私のDelegatingHandlerは "クライアント側"で、つまりSomeOtherServiceにリクエストを行うために使用されます。 "クライアント側"にはOwinは関与していないため、request.GetOwinContext()はnullを返します。 – kryz

+0

私はあなたの最初の 'SendAsync'を試して、null owinContexesを取得していません。あなたはどうやってOwinを設立していますか? http://stackoverflow.com/questions/23252251/asp-net-webapi-owin-why-would-request-getowincontext-return-nullを見てください。私が試したプロジェクト:https://github.com/petreturcu/CodePractice/tree/master/Practice/ExtendingWebApi –

関連する問題