它是IDictionary<string, string[]>
。键是一个字符串,但值是一个字符串数组。所以,你只需要像这样设置标题。
app.Run(async (IOwinContext context) =>
{
context.Response.Headers.Add("WWW-Authenticate",
new[] { "Bearer", "X-Custom" });
// Some other code
});
更新我相信你很乐意接受我的回答作为答案:)。谢谢,但不确定它回答了您的问题并因此进行了编辑。首先,我没有理解您试图提出的观点,即添加来自不同中间件的不同标头,但又希望在响应中的不同行中看到它们。我不认为对于像 WWW-Authenticate 这样的标准 HTTP 标头可以这样做。其实在回答你的问题之前,我很快就写了一个小程序来验证,但我犯的错误是拼错了这个标题。因此,我实际上得到了这样的标题值。
WWW-Authentciate: X-Custom
WWW-Authentciate: Bearer
无论如何,以下方法可以在两行中获取标题值。
app.Use(async (IOwinContext context, Func<Task> next) =>
{
context.Response.Headers.Set("WWW-Authenticate", "Bearer");
await next.Invoke();
});
app.Run(async (IOwinContext context) =>
{
var x = context.Response.Headers.Get("WWW-Authenticate");
context.Response.Headers.Remove("WWW-Authenticate");
context.Response.Headers.Add("WWW-Authenticate", new[] { "X-Custom", x });
});
但是,这不适用于标准标题。尽管如此,这是一个有趣的练习,但归根结底,这里的 API 没有公认的标准(据我所知)。即使您以某种方式使其以您想要的方式工作,当您更改底层 OWIN 组件(例如服务器或主机)时,您可能会得到不同的行为。毕竟,选项 a 和选项 b 完全相同,如果您在某个库之上工作以读取标题,您应该不会看到任何区别,除非您执行一些低级别的操作。