我开发了一些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");
答案 0 :(得分:2)
我不知道您的实时设置和单元测试之间有什么区别,但您应该知道,如果以前的中间件开始写入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);
}
注意:首先发送标头,它们可以将写入正文流的任何内容直接传输到套接字,而无需在内存中缓冲。这也意味着如果其他中间件在处理过程中已经写入输出流时,您的测量结果将不正确...