2017-10-16 4 views
0

내 .net 프레임 워크 웹 응용 프로그램에서 배치 요청에 대한 지원을 설정 한 후. 각각의 개별 요청에 무기명 토큰을 복사하는 경우에도 개별 요청은 금지되어 반환됩니다. 내 배치 지원에 대한 내 통합 테스트는 다음과 같습니다. 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이라는 다른 로컬 변수에 Authorization 헤더를 추가했는지 확인하십시오. batchRequest 변수에 인증 헤더를 추가하거나 다른 HttpMessageContent 인스턴스를 생성자 인수로 requestMessage으로 만드십시오.

+0

내 코드를 붙여 넣을 때 명확하지 않았습니다. 그러나 Serverhelper는 일괄 요청에 권한 부여 헤더를 추가합니다. 여기서 언급 한 단계는 베어러 토큰을 _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)); 

합니다.