2017-10-16 110 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)); 

那就是所有的事情。