c# – 未发送自定义响应标头

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

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

点赞