简体   繁体   English

WCF轮询双工会话

[英]WCF polling duplex session

I have a Silverlight client which tries to create a session but the server doesn't respond (the client throws a timeout exception). 我有一个尝试创建会话的Silverlight客户端,但服务器没有响应(客户端抛出超时异常)。 In the server log I've found: 在服务器日志中,我发现:

<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>

What does it mean? 这是什么意思? Why does the WCF service with polling duplex binding can't " accepts new sessions "? 为什么带有轮询双工绑定的WCF服务不能“ 接受新会话 ”?

UPDATE: Server has about 20 concurrent session requests and most of them were failed. 更新:服务器大约有20个并发会话请求,其中大多数失败。 But when I started another test run, all is ok. 但是当我开始另一次测试运行时,一切正常。 This issue occurs from time to time, restarting the server usually resolve this problem. 有时会发生此问题,重新启动服务器通常可以解决此问题。 Server configuration: 服务器配置:

<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>

What polling duplex mode are you using ? 您正在使用哪种轮询双工模式? I have encountered a similar problem where the server was having problems with multiple messages. 我在服务器遇到多个消息时遇到了类似的问题。

The solution was to change my PollingDuplexMode to SingleMessagePerPoll. 解决方案是将我的PollingDuplexMode更改为SingleMessagePerPoll。 It seems WCF has some problems with MultipleMessagesPerPoll. 似乎WCF的MultipleMessagesPerPoll存在一些问题。

You can change the mode while constructing the Binding: 您可以在构造绑定时更改模式:

new PollingDuplexHttpBinding(PollingDuplexMode.SingleMessagePerPoll);

Or in the config file. 或在配置文件中。

two things come to mind and I should note that I haven't done this with Silverlight, only regular WCF. 我想到了两件事,我应该注意,我还没有使用Silverlight(只有常规WCF)做到这一点。 There is a limit to the number of concurrent sessions you can have active. 您可以激活的并发会话数是有限制的。 This limit is 16 I believe out of the box. 我认为这个限制是16。 You can see how to change it in this answer 您可以在此答案中看到如何更改它

WCF Concurrent requests piling up on the server when using WSHttpBinding 使用WSHttpBinding时,WCF并发请求在服务器上堆积

or you can change it in the svc file editor. 或者您可以在svc文件编辑器中对其进行更改。 If you're defining your server in code, you need to find that option in the binding and I can't remember that off the top of my head. 如果要用代码定义服务器,则需要在绑定中找到该选项,而我不记得了。

You also may be backing up at the server. 您也可能正在服务器上备份。 I would suggest (after checking your locking model) to mark the service contract as Concurrency=Multiple 我建议(在检查锁定模型之后)将服务合同标记为Concurrency = Multiple

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM