8

In ASP.NET Core 1.0 ogni risposta includerà l'intestazione Server: Kestrel. Voglio rimuovere questa intestazione insieme ad altra intestazione come X-Power-By usando il middleware.Come rimuovere l'intestazione del server usando il middleware?

So che possiamo rimuovere l'intestazione di Kestrel nella configurazione host impostando quanto segue, ma voglio farlo usando il middleware (in realtà quando abbiamo Httpmodule possiamo fare così, quindi sto imparando la stessa cosa). Ho provato il mio po 'non ha funzionato.

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

codice provato:

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

La proprietà booleana dovrebbe lavoro. – davidfowl

+0

So che funzionerà, ma voglio rimuovere tutte le intestazioni di questo tipo da un singolo luogo. – dotnetstep

+0

nuovo WebHostBuilder(). UseKestrel (c => c.AddServerHeader = false) ha funzionato per me! –

risposta

8

Ho verificato che questo codice sta lavorando come di Kestrel 1.0.0:

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

Ciò elimina la Server: Kestrel colpo di testa dalla risposta.


Se si desidera rimuovere altre intestazioni arbitrarie dalla risposta, una variazione del codice funzionerà. Questo non funziona per l'intestazione Server: Kestrel, poiché sembra che Kestrel lo aggiunga dopo le esecuzioni del delegato OnSending.

Ecco un middleware campione che rimuoverà le intestazioni si passa ad esso:

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

Per usarlo, aggiungerlo al vertice della vostra applicazione gasdotto:

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