WCF опрос дуплекс - PullRequest
       64

WCF опрос дуплекс

0 голосов
/ 01 марта 2011

У меня есть клиент 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>

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

на ум приходят две вещи, и я должен отметить, что я не делал этого с Silverlight, только с обычным WCF. Существует ограничение на количество одновременных сеансов, которые вы можете иметь активными. Этот предел составляет 16 я считаю из коробки. Вы можете увидеть, как это изменить в этом ответе

WCF Параллельные запросы накапливаются на сервере при использовании WSHttpBinding

или вы можете изменить его в редакторе файлов SVC. Если вы определяете свой сервер в коде, вам нужно найти эту опцию в привязке, и я не могу вспомнить это на макушке.

Вы также можете выполнять резервное копирование на сервере. Я бы предложил (после проверки вашей модели блокировки) пометить контракт на обслуживание как Concurrency = Multiple

0 голосов
/ 22 марта 2011

Какой режим дуплекса вы используете?Я столкнулся с подобной проблемой, когда на сервере возникали проблемы с несколькими сообщениями.

Решение было изменить мой PollingDuplexMode на SingleMessagePerPoll.Кажется, у WCF есть некоторые проблемы с MultipleMessagesPerPoll.

Вы можете изменить режим при создании привязки:

new PollingDuplexHttpBinding(PollingDuplexMode.SingleMessagePerPoll);

Или в файле конфигурации.

...