ret*_*tif 3 asp.net-core-mvc asp.net-core
Startup.cs:
// ...
app.Use(async (context, next) =>
{
context.Response.Headers.Add("X-Frame-Options", "DENY");
context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
context.Response.Headers.Add("Server", "ololo");
await next();
});
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }
else { app.UseExceptionHandler("/Home/Error"); }
app.UseStaticFiles();
app.UseAuthentication();
// ...
Run Code Online (Sandbox Code Playgroud)
当一切正常时,我会按预期得到以下标头:
HTTP/1.1 200 OK
Connection: close
Date: Mon, 30 Jul 2018 18:39:33 GMT
Content-Type: text/html; charset=utf-8
Server: ololo
Transfer-Encoding: chunked
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Run Code Online (Sandbox Code Playgroud)
因此Server,X-Frame-Options和X-Content-Type-Options标头被覆盖。
但是如果我的代码中有未处理的异常,那么我会得到这些标头:
HTTP/1.1 500 Internal Server Error
Connection: close
Date: Mon, 30 Jul 2018 18:35:49 GMT
Content-Type: text/html; charset=utf-8
Server: Kestrel
Cache-Control: no-cache
Pragma: no-cache
Transfer-Encoding: chunked
Expires: -1
Run Code Online (Sandbox Code Playgroud)
所以标题不会被覆盖。
这是为什么?是设计使然吗?异常中间件的工作方式是否不同,因此它不会遍历整个管道?
dotnet --info
.NET Command Line Tools (2.1.4)
Product Information:
Version: 2.1.4
Commit SHA-1 hash: 5e8add2190
Microsoft .NET Core Shared Framework Host
Version : 2.0.5
Build : 17373eb129b3b05aa18ece963f8795d65ef8ea54
Run Code Online (Sandbox Code Playgroud)
在任何情况下设置标头的更可靠方法是使用回调OnStarting。请参阅文档。
添加一个委托,在响应标头发送到客户端之前调用。
public async Task Invoke(HttpContext context)
{
context.Response.OnStarting(() =>
{
context.Response.Headers.Add("X-Frame-Options", "DENY");
context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
context.Response.Headers.Add("Server", "ololo");
return Task.CompletedTask;
});
await _next(context);
}
Run Code Online (Sandbox Code Playgroud)
OnStarting将在响应标头写入线路之前被调用。这允许您在异常中间件处理后设置标头
| 归档时间: |
|
| 查看次数: |
1040 次 |
| 最近记录: |