自定义响应标头未发送

时间:2015-09-21 11:38:30

标签: c# .net owin

我开发了一些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");

1 个答案:

答案 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);
}

注意:首先发送标头,它们可以将写入正文流的任何内容直接传输到套接字,而无需在内存中缓冲。这也意味着如果其他中间件在处理过程中已经写入输出流时,您的测量结果将不正确...