C#WCF gzip压缩IIS can';t使svc/gzip工作(使用CloudFlare)

C#WCF gzip压缩IIS can';t使svc/gzip工作(使用CloudFlare),c#,wcf,C#,Wcf,我有一个连接到WCF服务的C#Winforms客户端。这在两台服务器上工作得非常好。但是现在我创建了一个新的服务器,具有完全相同的代码、相同的web.config等,并且由于某种原因,gzip不能像预期的那样工作,但问题肯定出在IIS配置中 它的工作方式是,如果在端点URL的末尾添加/gzip,那么它将压缩响应 例如,在我的Winform应用程序中,我扩展了我的WCF服务引用,因此我们可以向端点添加/gzip,如下所示: this.Endpoint.Address = new System.Se

我有一个连接到WCF服务的C#Winforms客户端。这在两台服务器上工作得非常好。但是现在我创建了一个新的服务器,具有完全相同的代码、相同的web.config等,并且由于某种原因,
gzip
不能像预期的那样工作,但问题肯定出在IIS配置中

它的工作方式是,如果在端点URL的末尾添加
/gzip
,那么它将压缩响应

例如,在我的Winform应用程序中,我扩展了我的WCF服务引用,因此我们可以向端点添加
/gzip
,如下所示:

this.Endpoint.Address = new System.ServiceModel.EndpointAddress(AppState.WCFServiceUrl + "util.svc/gzip");
正如我所说的,这在两台服务器上工作得非常好,所以不是客户端或服务器。新的服务器配置中缺少了什么东西,这让我很头疼

因此,在不工作的服务器上,如果您只使用.svc输入端点,它可以正常工作:

如果您添加
/gzip
,您将得到404错误,而这不应该发生

工作的服务器中您会收到400个错误请求,通过这种方式,它非常适合客户端:

有没有任何线索可能是缺少的配置或什么?顺便说一句,所有服务器都启用了动态压缩,等等

更新

我想我的问题出在服务器web.config上

<service behaviorConfiguration="Services.UtilBehavior" name="Services.Util">
        <endpoint address="gzip" bindingConfiguration="CustomBinding_IUtil" binding="customBinding" contract="Services.IUtil">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>


我认为这可能是一个很久以前就存在的问题:
endpoint address=“gzip”
,如果我更改为
address=“”
,那么就不需要在客户端的端点URL之后发送额外的
/gzip

所以这简直是疯了,花了将近20个小时不停(不开玩笑,不停地吃,不吃午饭,什么都不吃,只有水)试着找出问题,这里是解决方案,以防有人遇到同样的问题

首先,
/gzip
是不正确的,即使它在其他服务器上工作也是不正确的。所以我以前在服务器
web.config
中为端点设置了:

<endpoint address="gzip" ....
然后,我再次从我的客户端尝试使用具有相同错误的服务,并前往服务器检查
Traces.svclog
文件内容。我发现的是:

 Severity="Error"><TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Channels.HttpChannelMessageReceiveFailed.aspx</TraceIdentifier><Description>Failed to lookup a channel to receive an incoming message. Either the endpoint or the SOAP action was not found.
Severity=“Error”>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Channels.HttpChannelMessageReceiveFailed.aspxFailed 查找通道以接收传入消息。未找到终结点或SOAP操作。
因此,它与客户端中接收到的相同异常类型相匹配。然后,我将all更改为不使用SSL,因此将客户端
app.config
和服务器
web.config
上的端点更改为仅使用http,并且成功了

所以问题出在SSL上,这个新服务器中使用的SSL Im是通过使用win acme工具生成的,用于生成Let's Encrypt证书,我将CloudFlare设置为DNS和网络管理器。因此,如果我有一些过滤器错误地重新路由请求或其他内容,我尝试查看CloudFlare,发现:


SSL加密模式是灵活的,然后我换成了完整的,瞧!花了20个小时的时间思考一个问题,认为这是WCF服务器配置,只是简单的SSL加密选择。这是我第一次使用
CloudFlare
,所以我是一个新手。希望这个答案能帮助我p任何其他人可能会陷入这种可怕、疲惫的境地。

WCF中的Compression Encoder可以使用gzip压缩响应。有关Compression Encoder的更多信息,请参阅以下链接:为什么在端点URL末尾添加/gzip,它将压缩响应。您在IIS中配置了什么?嗨,我不记得了为什么在末尾添加/gzip会进行压缩。我7年前就这样做了:)。这不是普通的事情吗?压缩应该在不发送gzip的情况下激活,对吗?我还记得我没有对IIS做任何特殊的操作来支持这个/gzip。我将尝试摆脱它,只需在不使用/gzip的情况下调用útil.svc就可以了
diagnostics>
                         <messageLogging maxMessagesToLog="30000" 
                                 logEntireMessage="true" 
                                 logMessagesAtServiceLevel="true" 
                                 logMalformedMessages="true" 
                                 logMessagesAtTransportLevel="true">
                         </messageLogging>
                 </diagnostics>

  </system.serviceModel>


<system.diagnostics>
                 <sources>
                         <source name="System.ServiceModel" 
                                 switchValue="Verbose, ActivityTracing" 
                                 propagateActivity="true" >
                                 <listeners>
                                         <add name="xml" />
                                 </listeners>
                         </source>
                         <source name="System.ServiceModel.MessageLogging" 
                                 switchValue="Verbose">
                                 <listeners>
                                         <add name="xml" />
                                 </listeners>
                         </source>
                 </sources>
                 <sharedListeners>
                         <add name="xml" 
                              type="System.Diagnostics.XmlWriterTraceListener" 
                               initializeData="c:\log\Traces.svclog" />
                 </sharedListeners>
                 <trace autoflush="true" />
         </system.diagnostics>
 Severity="Error"><TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Channels.HttpChannelMessageReceiveFailed.aspx</TraceIdentifier><Description>Failed to lookup a channel to receive an incoming message. Either the endpoint or the SOAP action was not found.