Asp.net web api OWIN OnSendingHeaders回调-读取响应正文

Asp.net web api OWIN OnSendingHeaders回调-读取响应正文,asp.net-web-api,owin,katana,Asp.net Web Api,Owin,Katana,这个问题与优素福的优秀作品有关。我喜欢OnSendingHeaderscallback。我现在可以添加响应头,而不用担心流的切换。无论如何,这是我的问题。可以像这样读取回调中的响应体吗 public override async Task Invoke(OwinRequest request, OwinResponse response) { request.OnSendingHeaders(state => { var resp = (Ow

这个问题与优素福的优秀作品有关。我喜欢
OnSendingHeaders
callback。我现在可以添加响应头,而不用担心流的切换。无论如何,这是我的问题。可以像这样读取回调中的响应体吗

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
的类的一部分,不想更改它们

如果我在管道处理开始之前将响应主体设置为memory stream(正如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);
    }
}

您想对响应主体做什么

此回调在第一次写入时调用,因此替换流为时已晚。您也无法读取响应流,因为响应流中通常没有存储任何内容。这通常是一个输出到网络的只写流


在这里,较早地替换响应流是正确的方法。

如果Web API响应缓冲区策略(
IHostBufferPolicySelector
)处于流模式,我不确定这是否可行。假设它不处于流模式,我如何从OnSendingHeaders回调中获得此功能?谢谢您的回答。这有助于了解替换流是正确的方法。你能看到我问题中的编辑吗?可以吗?我只想创建一个
HttpResponseMessage
对象(只对响应主体感兴趣),并将其传递给其他组件,该组件使用
ReadAsStringAsync()
将主体作为字符串读取。您应该在自己的缓冲区实例上而不是在response.body上执行操作(查找)。其他中间件也可能正在取代流。