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上执行操作(查找)。其他中间件也可能正在取代流。