Как удалить заголовок сервера, используя промежуточное ПО?

В 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>();
    }
}
 dotnetstep13 июл. 2016 г., 04:26
Я знаю, что это будет работать, но я хочу удалить все такие заголовки из одного места.
 davidfowl12 июл. 2016 г., 10:15
Логическое свойство должно работать.
 Yawar Murtaza29 мар. 2017 г., 11:36
новый WebHostBuilder (). UseKestrel (c => c.AddServerHeader = false) работал для меня!

Ответы на вопрос(1)

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

Ваш ответ на вопрос