8

In ASP.NET Core 1.0 enthält jede Antwort die Kopfzeile Server: Kestrel. Ich möchte diesen Header zusammen mit anderen Header wie X-Power-By mit Middleware entfernen.Wie Server Header mit Middleware entfernen?

Ich weiß, dass wir Kestrel-Header in Host-Konfiguration entfernen können, indem Sie Folgendes setzen, aber ich möchte es mit Middleware tun (tatsächlich, wenn wir Httpmodule haben können wir so tun, damit ich das gleiche lernen). Ich habe es versucht, aber es hat nicht funktioniert.

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

Versuchte Code:

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

Die boolean Eigenschaft sollte Arbeit. – davidfowl

+0

Ich weiß, es wird funktionieren, aber ich möchte alle solche Header von einem einzigen Ort entfernen. – dotnetstep

+0

neuer WebHostBuilder(). UseKestrel (c => c.AddServerHeader = false) hat für mich funktioniert! –

Antwort

8

Ich habe festgestellt, dass dieser Code als von Kestrel arbeitet 1.0.0:

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

Dies entfernt die Server: Kestrel Header aus der Antwort.


Wenn Sie andere willkürliche Header aus der Antwort entfernen möchten, funktioniert eine Variation Ihres Codes. Diese funktioniert nicht arbeiten für die Server: Kestrel Header, weil es scheint, dass Kestrel fügt dies nach dem OnSending Delegat läuft.

Hier ist eine Probe Middleware, die alle Header entfernen werden Sie es passieren:

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

es zu benutzen, es an die Spitze der Anwendung Pipeline hinzuzufügen:

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