【问题标题】:How to remove server header using middleware?如何使用中间件删除服务器标头?
【发布时间】:2016-11-11 19:24:35
【问题描述】:

在 ASP.NET Core 1.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>();
    }
}

【问题讨论】:

  • 布尔属性应该可以工作。
  • 我知道它会起作用,但我想从一个地方删除所有此类标题。
  • new WebHostBuilder().UseKestrel(c => c.AddServerHeader = false) 为我工作!

标签: asp.net-core .net-core asp.net-core-1.0 asp.net-core-middleware


【解决方案1】:

我已验证此代码从 Kestrel 1.0.0 开始运行:

.UseKestrel(opt => opt.AddServerHeader = false)

这会从响应中删除 Server: Kestrel 标头。


如果您想从响应中删除其他任意标头,您的代码的变体将起作用。这适用于 Server: Kestrel 标头,因为 Kestrel 似乎在 OnSending 委托运行后添加了此标头。

这是一个示例中间件,它将删除您传递给它的任何标头:

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");

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2016-05-23
    • 2010-11-13
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多