8

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

ブール型プロパティは、必要があります作業。 – davidfowl

+0

私はそれが動作することを知っているが、私は単一の場所からすべてのそのようなヘッダーを削除したい。 – dotnetstep

+0

新しいWebHostBuilder()。UseKestrel(c => c.AddServerHeader = false)が私のために働いた! –

答えて

8

私はこのコードがケストレル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"); 
関連する問題