我如何要求 Owin/Katana 将 headers 写入输出流?
How do I ask Owin/Katana to write headers to the output stream?
当我写回复时,Katana 跳过发送 Elapsed-Time 回复 header。在我第一次写入流之前如何让它为我设置 headers?
中间件#1
public override async Task Invoke(IOwinContext context)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
await Next.Invoke(context);
stopwatch.Stop();
context.Response.Headers.Add("Elapsed-Time", new[] {stopwatch.ElapsedMilliseconds.ToString()});
}
中间件#2
public override async Task Invoke(IOwinContext context)
{
await context.Response.WriteAsync("test");
}
使用 Response
的 Headers
属性。
public override async Task Invoke(IOwinContext context)
{
context.Response.Headers.Add("Content-Length", <somelength>);
await context.Response.WriteAsync("test");
}
更新
您的中间件看起来是正确的。也许,您的配置有问题。
检查一下,如果你像这样流水线化你的中间件:
app.Use(typeof(MiddlewareOne))
.Use(typeof(MiddlewareTwo));
顺便说一句,你不需要两个中间件。这将用作墙:
public class MyMiddleware : OwinMiddleware
{
public MyMiddleware(OwinMiddleware next)
: base(next)
{}
public override async Task Invoke(IOwinContext context)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
await context.Response.WriteAsync("test");
stopwatch.Stop();
context.Response.Headers.Add("Elapsed-Time", new[] {stopwatch.ElapsedMilliseconds.ToString()});
}
}
配置为:
app.Use(typeof(MyMiddleware));
经过一些研究,答案是设置 headers 需要在 OnSendingHeaders 中进行。这确保 headers 在写入输出流之前设置。例如:
public override async Task Invoke(IOwinContext context)
{
var stopwatch = new Stopwatch();
context.Response.OnSendingHeaders(x =>
{
stopwatch.Stop();
context.Response.Headers.Add("X-Processing-Time", new[] {stopwatch.ElapsedMilliseconds.ToString()});
}, null);
stopwatch.Start();
await Next.Invoke(context);
stopwatch.Stop();
}
当我写回复时,Katana 跳过发送 Elapsed-Time 回复 header。在我第一次写入流之前如何让它为我设置 headers?
中间件#1
public override async Task Invoke(IOwinContext context)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
await Next.Invoke(context);
stopwatch.Stop();
context.Response.Headers.Add("Elapsed-Time", new[] {stopwatch.ElapsedMilliseconds.ToString()});
}
中间件#2
public override async Task Invoke(IOwinContext context)
{
await context.Response.WriteAsync("test");
}
使用 Response
的 Headers
属性。
public override async Task Invoke(IOwinContext context)
{
context.Response.Headers.Add("Content-Length", <somelength>);
await context.Response.WriteAsync("test");
}
更新
您的中间件看起来是正确的。也许,您的配置有问题。
检查一下,如果你像这样流水线化你的中间件:
app.Use(typeof(MiddlewareOne))
.Use(typeof(MiddlewareTwo));
顺便说一句,你不需要两个中间件。这将用作墙:
public class MyMiddleware : OwinMiddleware
{
public MyMiddleware(OwinMiddleware next)
: base(next)
{}
public override async Task Invoke(IOwinContext context)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
await context.Response.WriteAsync("test");
stopwatch.Stop();
context.Response.Headers.Add("Elapsed-Time", new[] {stopwatch.ElapsedMilliseconds.ToString()});
}
}
配置为:
app.Use(typeof(MyMiddleware));
经过一些研究,答案是设置 headers 需要在 OnSendingHeaders 中进行。这确保 headers 在写入输出流之前设置。例如:
public override async Task Invoke(IOwinContext context)
{
var stopwatch = new Stopwatch();
context.Response.OnSendingHeaders(x =>
{
stopwatch.Stop();
context.Response.Headers.Add("X-Processing-Time", new[] {stopwatch.ElapsedMilliseconds.ToString()});
}, null);
stopwatch.Start();
await Next.Invoke(context);
stopwatch.Stop();
}