[英]How do you convert a pollingDuplex binding into a custom binding?
我在我的Silverlight Web应用程序和WCF Web服务之间的通信中使用pollingDuplex绑定。 直到我尝试将大量数据以xmlString的形式从Web应用程序发送到Web服务之前,它一直运行良好。 然后我得到了错误信息:
“格式化程序尝试对消息进行反序列化时引发了异常:对操作'SendUserSelection'的请求消息主体进行反序列化时出错。读取XML数据时,已超出最大字符串内容长度配额(8192)。可以通过更改来增加此配额创建XML阅读器时使用的XmlDictionaryReaderQuotas对象的MaxStringContentLength属性。”
我发现为了增加MaxStringContentLength属性,我必须将pollingDuplex绑定转换为自定义绑定( http://blogs.msdn.com/b/silverlightws/archive/2010/04/04/some-known-wcf- issue-in-silverlight-4.aspx )。 我的问题是我该怎么做?
在Web服务的web.config文件中定义的我的pollingDuplex绑定如下所示:
<pollingDuplex>
<binding name="myPollingDuplex" closeTimeout="00:10:00" openTimeout="00:10:00"
receiveTimeout="00:10:00" sendTimeout="00:10:00" duplexMode="MultipleMessagesPerPoll" />
端点:
<endpoint address="" binding="pollingDuplex" bindingConfiguration="myPollingDuplex" contract="WebApplication.Web.MainWS"/>
Web应用程序端用于实例化Web服务客户端的代码:
this.client = new MainWSRef.MainWSClient(new PollingDuplexHttpBinding { DuplexMode = PollingDuplexMode.MultipleMessagesPerPoll },
new EndpointAddress("http://localhost:1981/MainWS.svc"));
我尝试了以下方法:
<customBinding>
<binding name="myPollingDuplex" closeTimeout="00:10:00" openTimeout="00:10:00"
receiveTimeout="00:10:00" sendTimeout="00:10:00">
<pollingDuplex duplexMode="MultipleMessagesPerPoll">
</pollingDuplex>
<textMessageEncoding>
<readerQuotas maxDepth="32" maxStringContentLength="5242880"
maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</textMessageEncoding>
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</customBinding>
终点:
<endpoint address="" binding="customBinding" bindingConfiguration="myPollingDuplex" contract="WebApplication.Web.MainWS"/>
Web应用程序端的代码:
CustomBinding binding = new CustomBinding(new PollingDuplexBindingElement(), new BinaryMessageEncodingBindingElement(), new HttpTransportBindingElement());
this.client = new MainWSRef.MainWSClient(binding, new EndpointAddress("http://localhost:1981/MainWS.svc"));
当我尝试运行代码时,出现以下错误消息:
“远程服务器返回错误:NotFound。”
难道我做错了什么? 我将不胜感激任何建议。
当我指定ReceiveTimeout="02:00:00"
,出现相同的错误,如果没有,它将正常工作。 我尝试找出如何正确设置ReveiveTimeout。
更新:我认为它的工作,这就是我的服务器web.config:
<customBinding>
<binding name="SLDuplexService" receiveTimeout="02:00:00">
<pollingDuplex duplexMode="MultipleMessagesPerPoll"
maxPendingSessions="2147483647" maxPendingMessagesPerSession="2147483647" maxOutputDelay="00:00:05"
inactivityTimeout="02:00:00" />
<binaryMessageEncoding/>
<httpTransport transferMode="StreamedResponse"/>
</binding>
</customBinding>
请注意,receiveTimeout是绑定的属性,而inactivityTimeout是pollingDuplex的属性。 如果您不希望在10分钟后出现故障通道,则必须设置两个超时时间。
您还必须在客户端上指定超时,那就是我的代码:
PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding(PollingDuplexHttpSecurityMode.None, PollingDuplexMode.MultipleMessagesPerPoll);
binding.InactivityTimeout = new TimeSpan(2,0,0);
binding.ReceiveTimeout = new TimeSpan(2, 0, 0);
_client = new SLDuplexServiceClient(binding, new EndpointAddress("http://localhost/LpSystem.ServiceInterface.Web/SLDuplexService/SLDuplexService.svc"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.