我开发了一些OWIN中间件来为响应添加自定义标头.但是,在我的集成测试(使用OWIN TestServer)中,我无法在响应对象中看到自定义标头.
我注意到我确实看到了填充POST请求的位置标题.
我还注意到,当我向服务发出实际请求时,标题出现了.
有谁知道为什么我在TestServer的情况下看不到自定义标头?我需要设置允许这些设置吗?
这是OWIN中间件:
private async Task CalculateTimeToProcess(IOwinContext context)
{
var sw = new Stopwatch();
sw.Start();
await Next.Invoke(context);
sw.Stop();
var response = context.Response;
response.Headers.Add("x-timetoprocessmilliseconds",
new[] { sw.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture) });
}
这是我试图在我的测试中检索标头的方式:
var header = _restContext.HttpResponseMessage.Headers.SingleOrDefault(x => x.Key == "x-timetoprocessmilliseconds");
最佳答案 我不知道你的实时设置和单元测试之间有什么区别,但是你应该知道如果以前的中间件开始写入response.Body,那么在OWIN管道返回到你的中间件之前会发送头文件(见下面的注释).
您可以做的是在调用下一个中间件之前将回调附加到OnSendingHeaders
.
private async Task CalculateTimeToProcess(IOwinContext context)
{
var sw = new Stopwatch();
sw.Start();
context.Response.OnSendingHeaders(state =>
{
sw.Stop();
var response = (IOwinResponse)state;
response.Headers.Add("x-timetoprocessmilliseconds", new[] { sw.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture) });
}, context.Response);
await Next.Invoke(context);
}
注意:通过首先发送标头,它们可以将写入正文流的任何内容直接传输到套接字,而无需在内存中缓冲.这也意味着如果其他中间件已经写入输出流,同时仍在处理事物,那么您的测量将是不正确的…