Asp.net core 如何使用中间件删除服务器头?

Asp.net core 如何使用中间件删除服务器头?,asp.net-core,.net-core,asp.net-core-1.0,asp.net-core-middleware,Asp.net Core,.net Core,Asp.net Core 1.0,Asp.net Core Middleware,在ASP.NET Core 1.0中,每个响应都将包含标题Server:Kestrel。我想使用中间件删除此头和其他头,如X-Power-By 我知道我们可以通过设置以下内容来删除主机配置中的Kestrel头,但我想使用中间件(实际上,当我们有Httpmodule时,我们可以这样做,所以我也在学习同样的东西)。我尽力了,但没有用 newwebhostbuilder() .UseKestrel(c=>c.AddServerHeader=false) 试用代码: 公共类headerremovidw

在ASP.NET Core 1.0中,每个响应都将包含标题
Server:Kestrel
。我想使用中间件删除此头和其他头,如
X-Power-By

我知道我们可以通过设置以下内容来删除主机配置中的Kestrel头,但我想使用中间件(实际上,当我们有Httpmodule时,我们可以这样做,所以我也在学习同样的东西)。我尽力了,但没有用

newwebhostbuilder()
.UseKestrel(c=>c.AddServerHeader=false)
试用代码:

公共类headerremovidware
{
private readonly RequestDelegate\u next;
public HeaderRemoverIDlware(RequestDelegate下一步)
{
_下一个=下一个;
}
公共异步任务调用(HttpContext HttpContext)
{
httpContext.Response.OnStarting(回调:removeHeaders,状态:httpContext);
wait_next.Invoke(httpContext);
}
私有任务removeHeaders(对象上下文)
{
var httpContext=(httpContext)context;
if(httpContext.Response.Headers.ContainsKey(“服务器”))
{
httpContext.Response.Headers.Remove(“服务器”);
}
返回Task.FromResult(0);
}
}
公共静态类HeaderRemoverExtensions
{
公共静态IApplicationBuilder UseServerHeaderRemover(此IApplicationBuilder生成器)
{
返回builder.UseMiddleware();
}
}

我已经验证了该代码在Kestrel 1.0.0中起作用:

.UseKestrel(opt=>opt.AddServerHeader=false)
这将从响应中删除
Server:Kestrel


如果要从响应中删除其他任意头,则可以修改代码。此不适用于
服务器:Kestrel
头,因为Kestrel似乎在运行
结束
委托后添加此项

下面是一个示例中间件,它将删除您传递给它的所有头:

公共类headerremovidware
{
private readonly RequestDelegate\u next;
私有只读不可变列表\u headersToRemove;
public HeaderRemoverIDlware(RequestDelegate next,ImmutableList headersToRemove)
{
_下一个=下一个;
_headersToRemove=headersToRemove;
}
公共异步任务调用(HttpContext HttpContext)
{
httpContext.Response.onStart(()=>
{
_headersToRemove.ForEach(header=>
{
if(httpContext.Response.Headers.ContainsKey(header))
{
httpContext.Response.Headers.Remove(header);
}
});
返回Task.FromResult(0);
});
wait_next.Invoke(httpContext);
}
}
公共静态类HeaderRemoverExtensions
{
公共静态IAApplicationBuilder UseHeaderRemover(此IAApplicationBuilder生成器,参数字符串[]headersToRemove)
{
返回builder.useMediddleware(headersToRemove.ToImmutableList());
}
}
要使用它,请将其添加到应用程序管道的最顶端:

app.UseHeaderRemover(“内容类型”、“其他标题”);

布尔属性应该可以工作。我知道它可以工作,但我想从单个位置删除所有这样的头。新建WebHostBuilder()。UseKestrel(c=>c.AddServerHeader=false)对我有效!