从 C# 6 中的响应标头中删除 SERVER

dan*_*elc 3 c# response-headers kestrel-http-server .net-6.0

我有一个 .net 6.0 C# API(使用 Kestrel 服务器在 Mac 上开发),它在响应标头中返回服务器。我尝试过的所有解决方案均适用于 6 年级之前的学生,并且不再相关。

我在我的Program.cs中尝试过:

app.Use((ctx, next) => {
    var headers = ctx.Response.Headers;

    headers.Add("X-Frame-Options", "DENY");
    headers.Add("X-XSS-Protection", "1; mode=block");
    headers.Add("X-Content-Type-Options", "nosniff");
    headers.Add("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload");

    headers.Remove("Server");

    return next();
});
Run Code Online (Sandbox Code Playgroud)

这不会删除服务器,但会添加其他标头。如果我添加带有空格的服务器属性(例如headers.Add("Server", "");),则不会显示服务器名称 (Kestrel),但标头属性仍然会出现。这可能达到了目的,但我宁愿它根本不出现。

ChatGPT(我知道,但我尝试了它作为最后的手段),建议

var host = new WebHostBuilder().UseKestrel(options => options.AddServerHeader = false).UseStartup<StartupBase>().Build();
Run Code Online (Sandbox Code Playgroud)

但这给出了运行时错误无法实例化服务类型“Microsoft.AspNetCore.Hosting.IStartup”的实现类型“Microsoft.AspNetCore.Hosting.StartupBase”。

作为一个不太重要的附带问题,由于删除服务器是最佳实践,我想知道为什么默认功能是包含它而不是省略它。难道不应该有责任添加它吗?包含该值的用例是什么?

Nin*_*rry 6

使用的正确语法是:

builder.WebHost.UseKestrel(option => option.AddServerHeader = false);
Run Code Online (Sandbox Code Playgroud)

builder变量在 Visual Studio 生成的默认模板中可用。

在默认模板中,它生成为:

var builder = WebApplication.CreateBuilder(args);
Run Code Online (Sandbox Code Playgroud)

其中args是传递给方法的参数Main。然后builder稍后使用 来生成app. 确保在调用Build生成 .kestrel 文件之前设置 Kestrel 选项app


该房产的文件KestrelServerOptions.AddServerHeader可在线获取。