0
私はOWINがホストしているASP.Net WebApi2 Microserviceで作業しています。私たちはAutofacをDependency Injectorとして使用しています。アクセス可能なOwinContext
私のサービスが呼び出されると、私はowinContext.Request.User.Identityにアクセスすることでユーザーに関する情報を取得できます。私の問題は、別のサービスに電話をかけてユーザー情報を渡す必要があるときです。ユーザー情報を含む認証トークンを作成し、そのトークンをRequestMessageに設定する必要があります。
"HttpClient-MessageHandler-Pipline"に配置できるDelegatingHandlerを作成したいと思います。しかし、DelegatingHandler.SendAsync()の内部では、私は現在のOwinContextにアクセスする必要があります。
私はさまざまなアプローチについて考えました。
- Autofacで、私は簡単にキャプティブ依存関係の問題を解決することはできません:しかし、私は本当に簡単に何かとエラーが発生しにくい(または多分私はこのアプローチの一つが実現可能にすることができる方法のヒント)があると思いますHttpClientをとしたがって、DelegatingHandlerはSingleInstanceとして登録されます。しかし、OwinContextはLifeTimeScopeに登録されています。ですから、私はOwinContextをDelegatingHandlerのコンストラクタに挿入することはできません。
- OwinContextを静的なSystem.Threading.AsyncLocal変数に設定するOwin-Middlewareを書くことができました。 DelegatingHandlerの内部では、その静的変数にアクセスできました。しかし、グローバル変数の変更は本当に間違っています。
- 私はDelegatingHandlerを全く書いていません。私のServiceRepository(LifeTimeScopeに登録することもできます)では、すべてのRequestMessagesを手作業で構築する必要があります。それで、RequestMessageにAuthorizationTokenを設定するのは簡単でしょう。しかし、例えば以下のような便利な方法を使用しない。 httpClient.PostAsJsonAsync()は多くの作業を行います。
ご回答ありがとうございます。私は次のSendAsyncメソッドを書いた: { var owinContextBeforeSend = request.GetOwinContext(); var response = await base.SendAsync(request、cancelationToken); var owinContextAfterSend = request.GetOwinContext(); リターンレスポンス。 } 残念ながら、owinContextBeforeSendとowinContextAfterSendはどちらもnullです。 (そして私はowinContextBeforeSendが必要です) – kryz
このアプローチはおそらく動作しません: "SomeClient ---> MyService ---> SomeOtherService"という3つの関係者が関わっています。 DelegatingHandlerを「サーバ側」に置くこと、すなわちSomeClientからの呼び出しを受信する場合、RequestMessageにはOwinContextが存在します。しかし、私のDelegatingHandlerは "クライアント側"で、つまりSomeOtherServiceにリクエストを行うために使用されます。 "クライアント側"にはOwinは関与していないため、request.GetOwinContext()はnullを返します。 – kryz
私はあなたの最初の '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 –