Изменить время ожидания WCF по умолчанию - PullRequest
4 голосов
/ 10 февраля 2010

У меня здесь дуплексная служба WCF, требование состоит в том, чтобы время обратного вызова для клиента было равно 10 секундам, поэтому мой файл web.config службы выглядит так:

        <bindings>
        <basicHttpBinding>
            <binding name="simulatorEndpoint" closeTimeout="00:00:10" openTimeout="00:00:10" 
                receiveTimeout="00:00:10" sendTimeout="00:00:10" allowCookies="false"
                bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">

                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
        <wsDualHttpBinding>
            <binding name="wsdualEndpoint" closeTimeout="00:00:10" openTimeout="00:00:10"
                receiveTimeout="00:00:10" sendTimeout="00:00:10" bypassProxyOnLocal="false"
                transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536" clientBaseAddress="http://localhost:1235"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:00:10"  />
                <security mode="Message">
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        algorithmSuite="Default" />
                </security>
            </binding>
        </wsDualHttpBinding>
    </bindings>

на стороне клиента привязки в файле app.config одинаковы с одинаковыми значениями времени ожидания.

Теперь эффект заключается в том, что, если клиент отправляет запрос на сервер, время ожидания составляет 10 секунд. Но с другой стороны, если служба отправляет обратный вызов клиенту, время ожидания составляет 1 минуту. Это очень странно ... очевидно, что время ожидания правильно установлено на стороне клиента ... но не на службе ... Как я могу изменить время ожидания на службе?

PS: я использую Visual Studio 2010 и режим его отладки с подходящим ASP.NET Development Server 10.0.0.0

Ответы [ 2 ]

4 голосов
/ 11 февраля 2010

Краткое описание привязок тайм-аутов ...

Клиентская сторона:

  • SendTimeout используется для инициализации OperationTimeout, который управляет всем взаимодействием при отправке сообщения (включая получение ответного сообщения в случае запроса-ответа). Этот тайм-аут также применяется при отправке ответных сообщений из метода CallbackContract.
  • OpenTimeout и CloseTimeout используются при открытии и закрытии каналов (когда не передается явное значение тайм-аута).
  • ReceiveTimeout не используется.

Серверная сторона:

  • Время ожидания отправки, открытия и закрытия такое же, как на клиенте (для обратных вызовов).
  • ReceiveTimeout используется уровнем ServiceFramework для инициализации тайм-аута простоя сеанса.

[править: некоторый код] Также попробуйте добавить это в конфигурацию вашего сервиса

<behaviors>
   <endpointBehaviors>
      <behavior name="MyCallbackBehavior">       
         <callbackTimeouts transactionTimeout="00:00:10"/>
      </behavior>
   </endpointBehaviors>
<behaviors>

затем добавьте поведение к вашей конечной точке

<endpoint behaviorConfiguration="MyCallbackBehavior" />
3 голосов
/ 11 февраля 2010

Хорошо, я нашел ошибку ...

я сделал настройку привязки прямо с

        <wsDualHttpBinding>
        <binding name="wsdualEndpoint" closeTimeout="00:00:10" openTimeout="00:00:10"
            receiveTimeout="00:00:10" sendTimeout="00:00:10" bypassProxyOnLocal="false"
            transactionFlow="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="524288" maxReceivedMessageSize="65536" clientBaseAddress="http://localhost:1235"
            messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            <reliableSession ordered="true" inactivityTimeout="00:00:10"  />
            <security mode="Message">
                <message clientCredentialType="Windows" negotiateServiceCredential="true"
                    algorithmSuite="Default" />
            </security>
        </binding>
    </wsDualHttpBinding>

но подсказка была в том, что это было мое объявление о конечной точке:

        <endpoint address="dual" binding="wsDualHttpBinding" 
      name="wsdualEndpoint" contract="INotificationService"/>

поскольку я предполагал, что он выберет определенные выше конфигурации привязки и использует их для моей конечной точки, но это было неправильно, я должен добавить bindingConfiguration = "ИМЯ КОНФИГУРАЦИИ" к объявлению конечной точки. *

Поэтому для вашей информации моя рабочая конфигурация выглядит следующим образом:

      <wsDualHttpBinding>
    <binding name="MywsdualEndpoint" sendTimeout="00:00:05" bypassProxyOnLocal="false"
        transactionFlow="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true"/>
      <security mode="Message">
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
            algorithmSuite="Default" />
      </security>
    </binding>
  </wsDualHttpBinding>

и правильное объявление конечной точки:

        <endpoint address="dual" binding="wsDualHttpBinding" bindingConfiguration="MywsdualEndpoint" contract="INotificationService"/>
...