8

Trong ASP.NET Core 1.0, mọi phản hồi sẽ bao gồm tiêu đề Server: Kestrel. Tôi muốn xóa tiêu đề này cùng với tiêu đề khác như X-Power-By bằng phần mềm trung gian.Làm cách nào để loại bỏ tiêu đề máy chủ bằng phần mềm trung gian?

Tôi biết rằng chúng tôi có thể loại bỏ tiêu đề Kestrel trong cấu hình máy chủ bằng cách thiết lập như sau nhưng tôi muốn làm điều đó bằng cách sử dụng phần mềm trung gian (thực sự khi chúng tôi có Httpmodule chúng tôi có thể làm như thế này để tôi học cùng một điều). Tôi đã thử bit của tôi nó không hoạt động.

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

đang thử:

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

Thuộc tính nên boolean công việc. – davidfowl

+0

Tôi biết nó sẽ làm việc nhưng tôi muốn loại bỏ tất cả các tiêu đề như vậy từ nơi duy nhất. – dotnetstep

+0

WebHostBuilder mới() Sử dụngKestrel (c => c.AddServerHeader = false) làm việc cho tôi! –

Trả lời

8

tôi đã xác minh rằng mã này đang làm việc như của Kestrel 1.0.0:

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

này loại bỏ các Server: Kestrel tiêu đề từ các phản ứng.


Nếu bạn muốn xóa các tiêu đề tùy ý khác khỏi phản hồi, biến thể mã của bạn sẽ hoạt động. Điều này không làm việc cho các tiêu đề Server: Kestrel, bởi vì nó xuất hiện rằng Kestrel thêm này sau khi chạy đại biểu OnSending.

Dưới đây là một middleware mẫu mà sẽ loại bỏ bất kỳ tiêu đề bạn vượt qua nó:

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

Để sử dụng nó, thêm nó vào phần trên của đường ống dẫn ứng dụng của bạn:

app.UseHeaderRemover("Content-Type", "AnotherHeader"); 
Các vấn đề liên quan