从响应中删除标头

时间:2012-06-22 11:18:06

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

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

  • 服务器
  • X-ASPNET-版
  • X-AspNetMvc-版
  • X供电-通过

该服务早先在WCF中托管,并且通过订阅PreSendRequestHeaders并操纵HttpContext.Current.Response.Headers,在HttpModule中完成了隐藏。使用ASP.NET WebAPI,现在所有内容都是基于任务的,因此HttpContext.Current为null。我试图插入一个消息处理程序并操纵返回的HttpResponseMessage,但标题不存在于该阶段。可以在IIS设置中删除X-Powered-By,但是删除其余设置的建议方法是什么?

4 个答案:

答案 0 :(得分:11)

问题是每个人都在不同的地方添加:

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

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

答案 1 :(得分:10)

为了通过谷歌/ 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下的root web.config中注册此模块(如果在此处运行IIS 7.0集成模式,请参阅更多详细信息):

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

希望这有帮助!

答案 2 :(得分:1)

如果你正在使用IIS7 / Azure,那么看看这个:

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

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

答案 3 :(得分: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>