2017-10-16 109 views
0

在我的.net框架web應用程序中設置了對批處理請求的支持。即使將我的不記名標記複製到每個單獨的請求,每個單獨的請求都會被禁止。 我的批處理支持的集成測試如下 - 我的ServerHelper代碼添加了不記名令牌的請求。負責將一批支持我的配置的批處理請求持票人標記

[TestMethod] 
public async Task BatchRequestTest() 
{ 
    var requestMessage = new HttpRequestMessage(HttpMethod.Get, ServerHelper.HttpClient.BaseAddress + "values/22"); 

    requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", await ServerHelper.GetAccessToken()); 

    var getMetricsRequest = new HttpMessageContent(requestMessage); 
    var getTransactionsRequest1 = new HttpMessageContent(new HttpRequestMessage(HttpMethod.Get, ServerHelper.HttpClient.BaseAddress + "values/23")); 
    var failingRequest = new HttpMessageContent(new HttpRequestMessage(HttpMethod.Get, ServerHelper.HttpClient.BaseAddress + "values/77")); 
    MultipartContent content = new MultipartContent("mixed", "batch_" + Guid.NewGuid().ToString()); 

    content.Add(getMetricsRequest); 
    content.Add(getTransactionsRequest1); 
    content.Add(failingRequest); 


    HttpRequestMessage batchRequest = new HttpRequestMessage(HttpMethod.Post, ServerHelper.HttpClient.BaseAddress + "batch") 
    { 
     Content = content 
    }; 

    var response = await ServerHelper.HttpClient.SendAsync(batchRequest); 
    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);//assert true 


    var responseContents = await response.Content.ReadAsMultipartAsync(); 

    var get1 = await responseContents.Contents[0].ReadAsHttpResponseMessageAsync(); 
    var get2 = await responseContents.Contents[1].ReadAsHttpResponseMessageAsync(); 
    var get3 = await responseContents.Contents[2].ReadAsHttpResponseMessageAsync(); 


    Assert.AreEqual(HttpStatusCode.OK, get1.StatusCode);//assert fail 
    Assert.AreEqual(HttpStatusCode.OK, get2.StatusCode);//assert fail 
    Assert.AreEqual(HttpStatusCode.NotFound, get3.StatusCode); 
} 

部分:

var server = new HttpServer(httpConfiguration); 

appBuilder.UseWebApi(server); 

httpConfiguration.Routes.MapHttpBatchRoute(
    routeName: "batch", 
    routeTemplate: "batch", 
    batchHandler: new DefaultHttpBatchHandler(server) 
    { 
     ExecutionOrder = BatchExecutionOrder.NonSequential 
    } 
); 

我需要的東西添加到我的管道?

+0

嘿,你找到了解決方案嗎?我遇到了同樣的問題,需要在我的批量請求中設置不記名令牌。 – ObiEff

回答

0

請注意,您已將授權標頭添加到另一個稱爲requestMessage的本地變量。嘗試將授權標頭添加到batchRequest變量和/或創建其他HttpMessageContent實例作爲構造函數參數requestMessage

+0

當我粘貼我的代碼時,我並不清楚。但是Serverhelper將Authorization Header添加到批量請求中。你提到的那個步驟是驗證是否將不記名標記添加到_inner_請求之一。我不會有未經授權的問題。 – cjp

0

今天來到這個問題上,所以我想我會張貼一個解決方案,以防其他人對此有所質疑。您可以通過擴展DefaultHttpBatchHandler來創建自定義批處理程序。在此之內,您可以在子請求上設置授權標頭。

public class AuthorizationBatchHandler : DefaultHttpBatchHandler 
{ 
    public AuthorizationBatchHandler(HttpServer httpServer) : base(httpServer) 
    { 
    } 

    public override async Task<IList<HttpRequestMessage>> ParseBatchRequestsAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var requests = await base.ParseBatchRequestsAsync(request, cancellationToken); 

     foreach (var childRequest in requests) 
     { 
      childRequest.Headers.Authorization = request.Headers.Authorization; 
     } 
     return requests; 
    } 
} 

你再用鐵絲它在你的啓動方法如下:

 httpConfiguration.Routes.MapHttpBatchRoute(
      routeName: "batch", 
      routeTemplate: "batch", 
      batchHandler: new AuthorizationBatchHandler(server)); 

那就是所有的事情。