Тайм-аут открытой операции - веб-сервис WCF - PullRequest
1 голос
/ 07 февраля 2012

Я создал веб-сервис.После определенного периода времени я в итоге получаю следующую ошибку: "Операция открытия не завершена в течение заданного времени ожидания 00:01:00. Время, отведенное для этой операции, могло быть частьюболее длительный тайм-аут. "

Я не уверен, почему я получаю эту ошибку, так как я установил тайм-аут открытия примерно на 2 часа.Я новичок в веб-сервисах WCF и веб-сервисах в целом.Есть ли какие-либо красные флаги с конфигурацией, которую я показал ниже?

.NET версия: 4.0

Конфигурация на стороне клиента:

<system.serviceModel>
<bindings>
  <netTcpBinding>
    <binding name="SecurityServiceDev" receiveTimeout="02:00:00" openTimeout="02:00:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxConnections="1000" maxBufferSize="2147483647">
      <security mode="Transport">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </netTcpBinding>
</bindings>
<diagnostics>
  <messageLogging logEntireMessage="true" maxMessagesToLog="300" logMessagesAtServiceLevel="true" logMalformedMessages="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<client>
  <endpoint address="net.tcp://XXX.svc" binding="netTcpBinding" bindingConfiguration="SecurityServiceDev" contract="SecurityProxy.ISecurityService" name="SecurityService" />
</client>

Конфигурация веб-службы:

<system.serviceModel>
<services>
  <service name="TMS.DAL.Common.Security.BAL.SecurityService" behaviorConfiguration="DataServiceBehavior">
    <endpoint address="net.tcp://XXX.svc"
                 name="SecurityService"
                 binding="netTcpBinding"
                 bindingConfiguration="Binding"
                 contract="TMS.DAL.Common.Security.BAL.ISecurityService"/>
    <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
  </service>
</services>
<bindings>
  <netTcpBinding>
    <binding name="Binding"
                receiveTimeout="02:00:00"
                openTimeout="02:00:00"
                maxBufferPoolSize="2147483647"
                maxReceivedMessageSize="2147483647"
                maxConnections="1000"
                maxBufferSize="2147483647">
      <security mode="Transport">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>
  </netTcpBinding>
</bindings>
<client/>
<behaviors>
  <serviceBehaviors>
    <behavior name="DataServiceBehavior" >
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <serviceMetadata httpGetEnabled="true" />
      <dataContractSerializer maxItemsInObjectGraph="61200000" />
      <serviceThrottling maxConcurrentCalls="1000"
      maxConcurrentInstances="2147483647" maxConcurrentSessions="1000"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

Единственная конфигурация внутри кода следующая:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class SecurityService : ISecurityService

Договор на обслуживание:

[ServiceContract]
public interface ISecurityService
{
    [OperationContract]
    bool IsUserInRole(String userName, String roleName);

    [OperationContract]
    bool DoesUserHavePermission(String userName, String permissionName);

    [OperationContract]
    List<String> GetUsersInRole(String roleName);

    [OperationContract]
    List<String> GetRolesForUser(String userName);

    [OperationContract]
    List<String> GetPermissionsForUser(String userName);

    [OperationContract]
    List<String> GetPermissionsForRole(String roleName);

    [OperationContract]
    List<String> GetRolesForApplication(String appName);

    [OperationContract(Name = "GetListValuesForRoleAndList")] 
    List<String> GetListValues(String roleName, String listNames);

    [OperationContract(Name = "GetListValuesForRolesAndList")] 
    List<String> GetListValues(List<String> roleNames, List<String> listNames);

    [OperationContract(Name = "GetListValuesForAppUserList")] 
    List<String> GetListValues(String appName, String userName, List<String> listNames);

    [OperationContract]
    List<String> GetListsForUser(String userName);

    [OperationContract]
    bool RoleExists(String roleName);

    [OperationContract]
    bool ExternalUserExists(String userName, String password);

1 Ответ

2 голосов
/ 08 февраля 2012

Каждая страница создается заново для запроса, а затем отбрасывается - NetTcpBinding по своей сути является сессионным, что означает, что он сохраняет ресурсы, пока клиент не скажет, что они им больше не нужны, или клиент уйдет, в вашем случае, на 2 часа, как у вас есть установите значение receiveTimeout на 2 часа.

Поскольку вы не вызываете Close WCF считает, что сеанс еще жив, и поэтому будет сбрасывать запросы с новых страниц, пока старые сеансы не начнут отсекать время. Дроссель сеанса .NET 4 по умолчанию довольно высок (100 х число ядер), и вы сами установили его на 1000, так что вы не увидите эту проблему, пока обработка не будет запущена некоторое время. В некоторых отношениях стандартное ограничение сеанса в .NET 3.5 было лучше в 10, поскольку это стало очень очевидно очень быстро, если вы оказались в ситуации, в которой вы находитесь

Я написал сообщение в блоге о сессиях некоторое время назад

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...