0
我正在使用OWIN託管的ASP.Net WebApi2 Microservice。我們使用Autofac作爲依賴注入器。訪問當前OwinContext
當我的服務被調用時,我可以通過訪問owinContext.Request.User.Identity來獲取有關用戶的信息。我的問題是,我必須撥打另一個服務並傳遞用戶信息。我必須創建一個包含用戶信息的授權令牌,並將該令牌設置爲RequestMessage。
我想寫一個DelegatingHandler,我可以放在「HttpClient-MessageHandler-Pipline」中。但是在DelegatingHandler.SendAsync()裏面,我需要訪問當前的OwinContext。
我想過不同的方法。但我真的希望有一些東西更容易,更容易出錯(或者一個暗示我怎麼能做出這樣的做法是可行的方法之一):
- 隨着Autofac我不能輕易解決圈養依賴性問題:HttpClient的和因此DelegatingHandler被註冊爲SingleInstance。但OwinContext在LifeTimeScope上註冊。所以我不能只將OwinContext注入到DelegatingHandler的構造函數中。
- 我可以編寫一個Owin-Middleware,將OwinContext設置爲一個靜態System.Threading.AsyncLocal變量。在DelegatingHandler中,我可以訪問該靜態變量。但是可變的全局變量對我來說確實是錯誤的。
- 我根本不寫一個DelegatingHandler。在我的ServiceRepository中(也可以在LifeTimeScope中註冊),我將不得不手動構造所有的RequestMessage。然後,將AuthorizationToken設置到RequestMessage上很容易。但不使用便利方法,例如httpClient.PostAsJsonAsync()帶來了很多工作。
感謝您的答覆。我編寫了以下SendAsync方法: {owl_internal_text_forend = request.GetOwinContext(); var response = await base.SendAsync(request,cancellationToken); var owinContextAfterSend = request.GetOwinContext(); 返回響應; } 不幸的是,owinContextBeforeSend和owinContextAfterSend都是null。 (我需要owinContextBeforeSend。) – kryz
這種方法可能無法工作:有3方參與「SomeClient ---> MyService ---> SomeOtherService」。在「服務器端」有一個DelegatingHandler,即當接收來自SomeClient的調用時,RequestMessage上會有一個OwinContext。但是,我的DelegatingHandler用於「客戶端」,即向SomeOtherService發出請求。在「客戶端」沒有涉及Owin,因此request.GetOwinContext()將返回null。 – kryz
我試過了你的第一個'SendAsync'並且沒有得到null owinContexes。你怎麼建立歐文?請看http://stackoverflow.com/questions/23252251/asp-net-webapi-owin-why-would-request-getowincontext-return-null;我嘗試的項目:https://github.com/petreturcu/CodePractice/tree/master/Practice/Extending WebApi –