在ASP.NET Core1.0中,每个响应都将包括报头Server: Kestrel
。我希望使用中间件删除这个标头和其他报头(如X-Power-By
)。
我知道我们可以通过设置以下内容来删除主机配置中的Kestrel报头,但我希望使用中间件(实际上,当我们有Httpmodule时,我们可以这样做,因此我正在学习相同的东西)。我试过了,但不起作用。
new WebHostBuilder()
.UseKestrel(c => c.AddServerHeader = false)
尝试过的代码:
public class HeaderRemoverMiddleware
{
private readonly RequestDelegate _next;
public HeaderRemoverMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
httpContext.Response.OnStarting(callback: removeHeaders, state: httpContext);
await _next.Invoke(httpContext);
}
private Task removeHeaders(object context)
{
var httpContext = (HttpContext)context;
if (httpContext.Response.Headers.ContainsKey("Server"))
{
httpContext.Response.Headers.Remove("Server");
}
return Task.FromResult(0);
}
}
public static class HeaderRemoverExtensions
{
public static IApplicationBuilder UseServerHeaderRemover(this IApplicationBuilder builder)
{
return builder.UseMiddleware<HeaderRemoverMiddleware>();
}
}
发布于 2016-07-12 07:48:02
我已经验证了这段代码在Kestrel 1.0.0中是有效的:
.UseKestrel(opt => opt.AddServerHeader = false)
这将从响应中移除Server: Kestrel
头。
如果要从响应中删除其他任意标题,代码的一个变体就可以工作。此不适用于Server: Kestrel
标头,因为似乎是在OnSending
委托运行后,Kestrel添加了此内容。
下面是一个示例中间件,它将删除传递给它的任何标头:
public class HeaderRemoverMiddleware
{
private readonly RequestDelegate _next;
private readonly ImmutableList<string> _headersToRemove;
public HeaderRemoverMiddleware(RequestDelegate next, ImmutableList<string> headersToRemove)
{
_next = next;
_headersToRemove = headersToRemove;
}
public async Task Invoke(HttpContext httpContext)
{
httpContext.Response.OnStarting(() =>
{
_headersToRemove.ForEach(header =>
{
if (httpContext.Response.Headers.ContainsKey(header))
{
httpContext.Response.Headers.Remove(header);
}
});
return Task.FromResult(0);
});
await _next.Invoke(httpContext);
}
}
public static class HeaderRemoverExtensions
{
public static IApplicationBuilder UseHeaderRemover(this IApplicationBuilder builder, params string[] headersToRemove)
{
return builder.UseMiddleware<HeaderRemoverMiddleware>(headersToRemove.ToImmutableList());
}
}
要使用它,请将其添加到应用程序管道的顶部:
app.UseHeaderRemover("Content-Type", "AnotherHeader");
https://stackoverflow.com/questions/38279974
复制