[英]WCF polling duplex session
我有一个尝试创建会话的Silverlight客户端,但服务器没有响应(客户端抛出超时异常)。 在服务器日志中,我发现:
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>0</EventID>
<Type>3</Type>
<SubType Name="Warning">0</SubType>
<Level>4</Level>
<TimeCreated SystemTime="2011-03-01T15:47:17.3951653Z" />
<Source Name="System.ServiceModel.PollingDuplex" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
<Execution ProcessName="w3wp" ProcessID="3820" ThreadID="17" />
<Channel />
<Computer>VM662</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Warning">
<TraceIdentifier>http://msdn.microsoft.com/ru-RU/library/System.ServiceModel.PollingDuplex.ListenerClosed.aspx</TraceIdentifier>
<Description>The service no longer accepts new sessions. An http error was returned.</Description>
<AppDomain>/LM/W3SVC/1/ROOT-1-129434680323302677</AppDomain>
<Source>System.ServiceModel.Channels.PollingDuplexChannelListener/40535505</Source>
<ExtendedData xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/PollingDuplexTraceRecord">
<clientAddress>http://docs.oasis-open.org/ws-rx/wsmc/200702/anonymous?id=1a9b0998-7fa0-4c53-8268-d4db5e8fad61</clientAddress>
<serverAddress>http://porn.com/getgirls.svc</serverAddress>
<sessionId>3d21efa1-1204-433a-8881-06cd6da7de60</sessionId>
<HttpStatusCode>NotFound</HttpStatusCode>
</ExtendedData>
</TraceRecord>
</DataItem>
</TraceData>
<System.Diagnostics xmlns="http://schemas.microsoft.com/2004/08/System.Diagnostics">
<LogicalOperationStack></LogicalOperationStack>
<Timestamp>2545401989404</Timestamp>
</System.Diagnostics>
</ApplicationData>
</E2ETraceEvent>
这是什么意思? 为什么带有轮询双工绑定的WCF服务不能“ 接受新会话 ”?
更新:服务器大约有20个并发会话请求,其中大多数失败。 但是当我开始另一次测试运行时,一切正常。 有时会发生此问题,重新启动服务器通常可以解决此问题。 服务器配置:
<system.diagnostics>
<sources>
<source name="System.ServiceModel.PollingDuplex" switchValue="Information">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="Default"/>
<add name="ServiceModelTraceListener" />
<add name="ServiceModelMessageLoggingListener" />
</listeners>
</source>
<!--<source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="Default"/>
<add name="ServiceModelMessageLoggingListener"/>
</listeners>
</source>
<source name="System.ServiceModel" switchValue="Warning, ActivityTracing" propagateActivity="true">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="Default"/>
<add name="ServiceModelTraceListener"/>
</listeners>
</source>-->
</sources>
<sharedListeners>
<add initializeData="c:\pdt_logs\messages.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelMessageLoggingListener" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp" />
<add initializeData="c:\pdt_logs\web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
<system.web>
<compilation targetFramework="4.0" />
</system.web>
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<extensions>
<bindingElementExtensions>
<add name="pollingDuplex" type="System.ServiceModel.Configuration.PollingDuplexElement, System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</bindingElementExtensions>
</extensions>
<bindings>
<customBinding>
<binding name="PollingDuplexBinding" >
<binaryMessageEncoding>
<readerQuotas maxArrayLength="16777216" maxBytesPerRead="16777216" maxDepth="16777216"
maxNameTableCharCount="16777216" maxStringContentLength="16777216"/>
</binaryMessageEncoding>
<pollingDuplex maxPendingSessions="100"
maxPendingMessagesPerSession="250" inactivityTimeout="24.20:31:23.6470000"/>
<httpTransport maxBufferSize="16777216"
maxReceivedMessageSize="16777216" />
</binding>
</customBinding>
</bindings>
<services>
<service name="PollingDuplexApplication.Services.TestService" behaviorConfiguration="ServiceBehavior">
<endpoint address=""
binding="customBinding"
contract="PollingDuplexApplication.Services.TestService"
bindingConfiguration="PollingDuplexBinding">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceThrottling maxConcurrentCalls="2048" maxConcurrentSessions="2048" maxConcurrentInstances="2048"/>
<dataContractSerializer maxItemsInObjectGraph="16777216"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
您正在使用哪种轮询双工模式? 我在服务器遇到多个消息时遇到了类似的问题。
解决方案是将我的PollingDuplexMode更改为SingleMessagePerPoll。 似乎WCF的MultipleMessagesPerPoll存在一些问题。
您可以在构造绑定时更改模式:
new PollingDuplexHttpBinding(PollingDuplexMode.SingleMessagePerPoll);
或在配置文件中。
我想到了两件事,我应该注意,我还没有使用Silverlight(只有常规WCF)做到这一点。 您可以激活的并发会话数是有限制的。 我认为这个限制是16。 您可以在此答案中看到如何更改它
使用WSHttpBinding时,WCF并发请求在服务器上堆积
或者您可以在svc文件编辑器中对其进行更改。 如果要用代码定义服务器,则需要在绑定中找到该选项,而我不记得了。
您也可能正在服务器上备份。 我建议(在检查锁定模型之后)将服务合同标记为Concurrency = Multiple
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.