2017-03-24 88 views
0

我正在使用OWIN託管的ASP.Net WebApi2 Microservice。我們使用Autofac作爲依賴注入器。訪問當前OwinContext

當我的服務被調用時,我可以通過訪問owinContext.Request.User.Identity來獲取有關用戶的信息。我的問題是,我必須撥打另一個服務並傳遞用戶信息。我必須創建一個包含用戶信息的授權令牌,並將該令牌設置爲RequestMessage。

我想寫一個DelegatingHandler,我可以放在「HttpClient-MessageHandler-Pipline」中。但是在DelegatingHandler.SendAsync()裏面,我需要訪問當前的OwinContext。

我想過不同的方法。但我真的希望有一些東西更容易,更容易出錯(或者一個暗示我怎麼能做出這樣的做法是可行的方法之一):

  1. 隨着Autofac我不能輕易解決圈養依賴性問題:HttpClient的和因此DelegatingHandler被註冊爲SingleInstance。但OwinContext在LifeTimeScope上註冊。所以我不能只將OwinContext注入到DelegatingHandler的構造函數中。
  2. 我可以編寫一個Owin-Middleware,將OwinContext設置爲一個靜態System.Threading.AsyncLocal變量。在DelegatingHandler中,我可以訪問該靜態變量。但是可變的全局變量對我來說確實是錯誤的。
  3. 我根本不寫一個DelegatingHandler。在我的ServiceRepository中(也可以在LifeTimeScope中註冊),我將不得不手動構造所有的RequestMessage。然後,將AuthorizationToken設置到RequestMessage上很容易。但不使用便利方法,例如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方法: {owl_internal_text_forend = request.GetOwinContext(); var response = await base.SendAsync(request,cancellationToken); var owinContextAfterSend = request.GetOwinContext(); 返回響應; } 不幸的是,owinContextBeforeSend和owinContextAfterSend都是null。 (我需要owinContextBeforeSend。) – kryz

+0

這種方法可能無法工作:有3方參與「SomeClient ---> MyService ---> SomeOtherService」。在「服務器端」有一個DelegatingHandler,即當接收來自SomeClient的調用時,RequestMessage上會有一個OwinContext。但是,我的DelegatingHandler用於「客戶端」,即向SomeOtherService發出請求。在「客戶端」沒有涉及Owin,因此request.GetOwinContext()將返回null。 – kryz

+0

我試過了你的第一個'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 –