이 질문은 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);
}
}
웹 API 응답 버퍼 정책 ('IHostBufferPolicySelector')이 스트리밍 모드 인 경우에도 이것이 작동하는지 확신 할 수 없습니다. –
스트리밍 모드가 아닌 것으로 가정하면 OnSendingHeaders 콜백에서 어떻게 작동합니까? – Badri