C#WCF gzip压缩IIS can';t使svc/gzip工作(使用CloudFlare)
我有一个连接到WCF服务的C#Winforms客户端。这在两台服务器上工作得非常好。但是现在我创建了一个新的服务器,具有完全相同的代码、相同的web.config等,并且由于某种原因,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
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.