13

我需要隐藏由 ASP.NET 和 IIS 生成并在 ASP.NET WebAPI 服务的响应中返回的某些标头。我需要隐藏的标题是:

  • 服务器
  • X-AspNet-版本
  • X-AspNetMvc-版本
  • X-Powered-By

该服务之前托管在 WCF 中,并且通过订阅 PreSendRequestHeaders 并操作 HttpContext.Current.Response.Headers 在 HttpModule 中完成伪装。使用 ASP.NET WebAPI,一切现在都是基于任务的,因此 HttpContext.Current 为空。我试图插入一个消息处理程序并操作返回的 HttpResponseMessage,但该阶段上不存在标头。X-Powered-By 可以在 IIS 设置中删除,但是建议的删除其余部分的方法是什么?

4

4 回答 4

11

问题是每个都在不同的点添加:

  • Server: 由 IIS 添加。尽管您似乎已经使用 HttpModule 将其删除,但不确定是否可以将其关闭。
  • X-AspNet-Version:由 System.Web.dll 在HttpResponse课堂上 Flush 时添加
  • X-AspNetMvc-Version:MvcHandler在 System.Web.dll 中添加。它可以被覆盖,所以这个应该没问题。
  • X-Powered-By由 IIS 但可以按您所说的那样关闭。

我认为你最好的选择仍然是使用 HttpModules。

于 2012-06-22T12:16:34.887 回答
10

为了那些通过 google/bing 搜索登陆这里的人的利益:: 以下是步骤摘要:

第 1 步:创建一个派生自 IHttpModule 的类(以及 IDisposable 以在我们完成后清理):

    public class MyCustomModule : IHttpModule, IDisposable
    {
         private HttpApplication _httpApplication
private static readonly List<string> HeadersToCloak = new List<string>
            {
                "Server",
                "X-AspNet-Version",
                "X-AspNetMvc-Version",
                "X-Powered-By"
            };
    ..
    }

第 2 步:在 IHttpModule.Init 方法中获取对内部上下文的引用,并将事件处理程序分配给 PreSendRequestHeaders 事件:

public void Init(HttpApplication context)
        {
            _httpApplication = context;

            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

第 3 步:现在可以像这样删除标题:

private void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            if (null == _httpApplication)
            {
                return;
            }

            if (_httpApplication.Context != null)
            {
                var response = _httpApplication.Response;
                HeadersToCloak.ForEach(header => response.Headers.Remove(header));
            }
        }

第 4 步:现在在 system.webserver 下的根 web.config 中注册此模块(如果运行 IIS 7.0 集成模式,请在此处查看更多详细信息):

<configuration>
  <system.webServer>
    <modules>
      <add name="MyCustomModule" type="<namespace>.MyCustomModule "/>
    </modules>
  </system.webServer>
</configuration>

希望这可以帮助!

于 2013-08-26T08:54:36.250 回答
1

如果您使用的是 IIS7 / Azure,请查看以下内容:

在没有 UrlScan 的情况下删除/隐藏/禁用 Azure/IIS7 中过多的 HTTP 响应标头

它展示了在不使用 HttpModules 的情况下禁用这些标头的最佳方法。

于 2012-10-09T16:12:58.103 回答
0

如果您想删除版本,请转到 web.config 文件并添加这些行

<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<!--enableVersionHeader remove the header-->
<httpRuntime targetFramework="4.5.2" enableVersionHeader = "false"/>

另外,添加这些

<httpProtocol>
  <customHeaders>
    <!--enableVersionHeader remove the header-->
    <remove name ="X-Powered-By"/>
    </customHeaders>
</httpProtocol>
于 2020-04-02T19:13:36.360 回答