2013-07-16 3 views
0

이 질문은 Youssef의 우수 answer과 관련이 있습니다. 나는 OnSendingHeaders 콜백을 좋아한다. 이제 스트림 전환에 대한 걱정없이 응답 헤더를 추가 할 수 있습니다. 어쨌든, 여기 내 질문입니다. 콜백 내에서 응답 본문을 읽을 수 있습니까? 그렇습니다.OWIN OnSendingHeaders 콜백 - 응답 본문 읽기

public override async Task Invoke(OwinRequest request, OwinResponse response) 
{ 
    request.OnSendingHeaders(state => 
     { 
      var resp = (OwinResponse)state; 
      // Here, I want to convert resp, which is OwinResponse 
      // to HttpResponseMessage so that when Content.ReadAsStringAsync 
      // is called off this HttpResponseMessage object, I want the 
      // response body as string. 

      var responseMessage = new HttpResponseMessage(); 
      responseMessage.Content = new StreamContent(resp.Body); 
      // Here I would like to call 
      // responseMessage.Content.ReadAsStringAsync() 

     }, response); 


    await Next.Invoke(request, response); 

} 

내가 콜백에서 호출 할 방법은 HttpResponseMessage에 의존하고이를 변경하지 않으 클래스의 일부입니다.

파이프 라인 처리가 시작되기 전에 메모리 스트림에 응답 본문을 설정하면 (링크 된 답변에서 Youssef가 처음 제안한 것처럼)이 작업을 수행 할 수 있습니다. 콜백에서 대신이 작업을 수행하는 더 좋은 방법이 있습니까?

편집 :

괜찮습니까?

public override async Task Invoke(OwinRequest request, OwinResponse response) 
{ 
    // Do something with request 

    Stream originalStream = response.Body; 

    var buffer = new MemoryStream(); 
    response.Body = buffer; 

    await Next.Invoke(request, response); 

    var responseMessage = new HttpResponseMessage(); 

    response.Body.Seek(0, SeekOrigin.Begin); 

    responseMessage.Content = new StreamContent(response.Body); 

    // Pass responseMessage to other classes for the 
    // response body to be read like this 
    // responseMessage.Content.ReadAsStringAsyn() 
    // Add more response headers 

    if (buffer != null && buffer.Length > 0) 
    { 
     buffer.Seek(0, SeekOrigin.Begin); 
     await buffer.CopyToAsync(originalStream); 
    } 
} 
+0

웹 API 응답 버퍼 정책 ('IHostBufferPolicySelector')이 스트리밍 모드 인 경우에도 이것이 작동하는지 확신 할 수 없습니다. –

+0

스트리밍 모드가 아닌 것으로 가정하면 OnSendingHeaders 콜백에서 어떻게 작동합니까? – Badri

답변

1

응답 본문으로 무엇을 하시겠습니까?

이 콜백은 첫 번째 쓰기에서 호출되므로 스트림을 대체하기에는 너무 늦습니다. 정상적으로 저장된 내용이 없으므로 응답 스트림에서도 읽을 수 없습니다. 이것은 일반적으로 네트워크로 나가는 쓰기 전용 스트림입니다.

응답 스트림을 이전 버전으로 교체하는 것이 올바른 방법입니다.

+0

답변 해 주셔서 감사합니다. 스트림을 교체하는 것이 여기에 올바른 접근법임을 알리는 데 도움이됩니다. 내 질문에 편집 내용을 볼 수 있습니까? 괜찮습니까? 난 단지 (응답 본문에만 관심이있는)'HttpResponseMessage' 객체를 생성하고,'ReadAsStringAsync()'를 사용하여 본문을 문자열로 읽는 다른 컴포넌트로 전달하려고합니다. – Badri

+0

당신은 response.Body보다는 당신의 버퍼 인스턴스에서 연산 (seek)을해야한다. 다른 미들웨어도 스트림을 대체 할 수 있습니다. – Tratcher