自定义回复 header 未发送

Custom response header not sent

我开发了一些 OWIN 中间件来将自定义 header 附加到响应中。但是,在我的集成测试(使用 OWIN TestServer)中,我在响应 object.

中看不到自定义 header

我注意到我确实看到了我为 POST 请求填充的位置 header。

我还注意到,当我向服务发出实际请求时,header 出现了。

有谁知道为什么我在 TestServer 的情况下看不到自定义 header?是否需要进行设置才能允许这些?

这是 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) });
}

这就是我在测试中尝试检索 header 的方式:

var header = _restContext.HttpResponseMessage.Headers.SingleOrDefault(x => x.Key == "x-timetoprocessmilliseconds");

我不知道你的实时设置和 unit-test 有什么区别,但你应该知道,如果任何以前的中间件开始写入 response.Body,headers 在 OWIN 管道 returns 之前发送到您的中间件(请参阅下面的注释)。

您可以做的是在调用下一个中间件之前将回调附加到 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);
}

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