从WCF中的HTTP响应中删除服务器

时间:2012-07-12 15:29:33

标签: c# wcf iis-7.5

我有一个在IIS 7.5上运行的Internet暴露的WCF服务,我需要保护它。 我想删除HTTP响应中的“Server”标头。

我已经实现了一个IDispatchMessageInspector,代码如下。

public void BeforeSendReply(ref Message reply, object correlationState)
{
    var context = WebOperationContext.Current;
    if (context != null)
    {
        context.OutgoingResponse.Headers.Remove(
            HttpResponseHeader.Server);
    }
}

但是,Server标头仍在响应中。 在调试时,我可以看到OutgoingResponse.Headers不包含HttpResonseHead.Server,如果我编写自己的值,它显然会被IIS管道中的某些内容所覆盖。

修改1

尝试以下情况,无论如何都

public class SecureServerHeaderModule : IHttpModule
{
    #region Implementation of IHttpModule

    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose() { }

    #endregion

    private static void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        var context = HttpContext.Current;
        if (context != null)
        {
            context.Response.Headers.Remove("Server");                
        }
    }
}

<system.web>
  <httpModules>
    <add "snip" />
  </httpModlules>
</system.web>
<system.webServer>
  <modules>
    <add "snip" />
  </modlules>
</system.webServer>

修改2

也没用。

public void BeforeSendReply(ref Message reply, object correlationState)
{
    var context = OperationContext.Current;
    if (context != null)
    {
        context.OutgoingMessageProperties.Remove(
            HttpResponseHeader.Server.ToString());
        context.OutgoingMessageProperties.Add(
            HttpResponseHeader.CacheControl.ToString(), "no-store");
    }
}

6 个答案:

答案 0 :(得分:3)

这可以使用IDispatchMessageInspector

public class SecureBehaviour : IDispatchMessageInspector
{
    public object AfterReceiveRequest(ref Message request,
        IClientChannel channel, InstanceContext instanceContext)
    {
        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {

        var httpCtx = HttpContext.Current;
        if (httpCtx != null)
        {
            httpCtx.Response.Headers.Remove(
                HttpResponseHeader.Server.ToString());
        }
    }
}

答案 1 :(得分:1)

由于您在IIS中托管服务并且已经启动了HttpModule,请尝试设置ASP.NET兼容模式,以便可以访问HttpContext.Current。您需要进行以下更改:

修改您的web.config并将以下内容添加到System.ServiceModel

<system.serviceModel>
  ...
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

使用以下属性装饰您的服务类:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

给HttpModule另一个镜头,你应该有更好的运气。

答案 2 :(得分:1)

您是否尝试过编辑web.config并使用customHeaders下的system.webServer标记。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name="Server" />
        <remove name="X-Powered-By" />
        <remove name="X-AspNet-Version" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

这导致我的C#ASP.NET应用程序只有以下响应头:

HTTP/1.1 200 OK
Cache-Control: max-age=3600, public
Content-Length: 20992
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Last-Modified: Tue, 15 May 2012 18:01:11 GMT
ETag: "HHktEL5IWA6rspl4Bg2ZxNmnV3gTUCLt2cTldSsl05A="
Vary: Accept-Encoding
Date: Tue, 17 Jul 2012 21:38:38 GMT

虽然我承认我没有尝试使用“服务器”标题,但这种方法似乎运行良好。我没有尝试使用“Server”标头的原因是我的IHttpModule中的以下代码工作得很好。

    void PreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        if(HttpRuntime.UsingIntegratedPipeline)
        {
            application.Response.Headers.Remove("Server");
            application.Response.Headers.Remove("Expires");
            application.Response.Headers.Remove("Cache-Control");
            application.Response.AddHeader("Cache-Control", "max-age=3600, public");
        }
    }

答案 3 :(得分:0)

正在进行中。

这个blog entry更多地回答了不同的管道以及为什么ASP.NET模块不能正常工作。

更多信息。

答案 4 :(得分:0)

对于我的自托管WCF服务,来自M Afifi的答案不起作用。我必须设置一个空标题:

httpCtx.OutgoingResponse.Headers.Add(HttpResponseHeader.Server.ToString(), string.Empty);

这会从响应中删除标题:

access-control-allow-headers →Content-Type, Authorization, Accept
access-control-allow-methods →GET, POST
access-control-allow-origin →*
content-type →application/json; charset=utf-8
date →Mon, 03 Jul 2017 07:22:17 GMT
status →200

答案 5 :(得分:-1)

您是否可以访问注册表?如果是这样,你可以尝试

HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader