WCF polling duplex session

1.5k views Asked by At

I have a Silverlight client which tries to create a session but the server doesn't respond (the client throws a timeout exception). 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"?

UPDATE: Server has about 20 concurrent session requests and most of them were failed. 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>

2

There are 2 answers

0
Gilles On

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. It seems WCF has some problems with MultipleMessagesPerPoll.

You can change the mode while constructing the Binding:

new PollingDuplexHttpBinding(PollingDuplexMode.SingleMessagePerPoll);

Or in the config file.

0
Steve On

two things come to mind and I should note that I haven't done this with Silverlight, only regular 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. You can see how to change it in this answer

WCF Concurrent requests piling up on the server when using WSHttpBinding

or you can change it in the svc file editor. 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