8

ASP.NET Core 1.0'da her yanıt, Server: Kestrel başlığını içerecektir. Bu başlığı, middleware kullanarak X-Power-By gibi diğer başlık ile birlikte kaldırmak istiyorum.Ortabilgi kullanılarak sunucu üstbilgisi nasıl kaldırılır?

Kestrel üstbilgisini ana makine yapılandırmasında aşağıdakileri ayarlayarak kaldırabileceğimizi biliyorum ancak bunu middleware kullanarak yapmak istiyorum (aslında Httpmodule olduğumuzda bunu yapabiliriz, böylece aynı şeyi öğreniyorum). Denedim, işe yaramadı.

new WebHostBuilder() 
    .UseKestrel(c => c.AddServerHeader = false) 

çalıştı kodu:

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>(); 
    } 
} 
+2

boolean mülkiyet gerektiği İşte

kendisine iletmek herhangi başlıklarını kaldıracak örnek bir katman var iş. – davidfowl

+0

Çalışacağını biliyorum ama bu tür tüm başlıkları tek bir yerden kaldırmak istiyorum. – dotnetstep

+0

new WebHostBuilder() KullanımKestrel (c => c.AddServerHeader = false) benim için çalıştı! –

cevap

8

Bu kod kerkenez 1.0.0 itibariyle çalıştığını doğruladıktan:

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

Bu yanıttan Server: Kestrel başlığını kaldırır.


Diğer rasgele başlıkları yanıttan kaldırmak isterseniz, kodunuzun bir değişimi çalışacaktır. Bu ,üstbilgisi için üstbilgisi çalışmaz, çünkü Kullrel bunu OnSending delege çalıştırıldıktan sonra ekler. ,

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()); 
    } 
} 

Kullanmak için uygulamanız boru hattının çok üstüne ekleyin::

app.UseHeaderRemover("Content-Type", "AnotherHeader");