【问题标题】:Removing headers from the response从响应中删除标头
【发布时间】:2012-06-24 16:36:45
【问题描述】:

我需要隐藏由 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 设置中删除,但是建议的删除其余部分的方法是什么?

【问题讨论】:

    标签: asp.net-web-api wcf-web-api


    【解决方案1】:

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

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

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

    【讨论】:

    • 你是对的。我能够在 HttpModule 中将它们全部删除(包括服务器)。唯一的问题是我如何获得对 HttpContext 的引用:HttpContext.Current 返回 null,但传递给 HttpModule 的 HttpApplication 实例上的 HttpApplication.Context 返回一个有效实例。
    【解决方案2】:

    为了那些通过 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>
    

    希望这会有所帮助!

    【讨论】:

    • 这实际上并没有删除X-Powered-By 标头。至少在 IIS 7 中没有。
    • @Ek0nomik 如果您可以访问 IIS 控制台,请检查 HttpReponseHeaders(双击图标)并从那里删除 X-Powered-By 标头。我也经历过,如果从 IIS 添加响应标头,它不会被 HttpModule 删除 - 它显示为来自 IIS 的标头稍后添加到管道中。
    【解决方案3】:

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

    Removing/Hiding/Disabling excessive HTTP response headers in Azure/IIS7 without UrlScan

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

    【讨论】:

    • 问题是关于通过自定义 HttpModule 删除,而不是关于如何删除它。我也遇到了这个问题,但仍然不知道如何摆脱它。使用 UrlScan 更耗时,并且在 Windows Server 2012 上不起作用。
    【解决方案4】:

    如果您想删除版本,请转到 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>
    

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 1970-01-01
      • 2013-12-09
      • 2018-07-09
      • 2011-02-13
      • 2011-12-18
      • 2018-06-11
      • 2017-07-11
      • 1970-01-01
      相关资源
      最近更新 更多