【问题标题】:Open Operation Timeout - WCF web service打开操作超时 - WCF Web 服务
【发布时间】:2012-02-06 22:34:29
【问题描述】:

我已经创建了一个网络服务。经过一段时间后,我最终得到以下错误:“打开操作未在分配的超时时间 00:01:00 内完成。分配给此操作的时间可能是更长的超时时间。”

我不确定为什么会收到此错误,因为我已将打开超时设置为大约 2 小时。我是 WCF Web 服务和一般 Web 服务的新手。我在下面显示的配置是否有任何危险信号?

.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);

【问题讨论】:

  • 您是否在完成通话后关闭客户端的代理?
  • 您使用的是什么版本的 .NET,您可以向我们展示服务合同吗?
  • @Tim Web 应用程序不断调用 Web 服务。我没有任何关闭客户端代理的代码。我希望连接是自动编码的。 Web 应用程序对 WS 进行了多次调用,我知道这可能是一个设计错误。如何关闭客户端的代理?
  • 我认为 Tim 是对的 - 基本上你正在破坏会话节流,进一步的请求正在排队,然后超时。您在哪里创建客户端代理?
  • 考虑使用 sendTimeout 属性以及其他超时属性

标签: asp.net-mvc wcf


【解决方案1】:

每个页面都为请求重新创建然后被丢弃 - NetTcpBinding 本质上是会话的,这意味着它会保留资源,直到客户端说他们不再需要它们或客户端离开了,在你的情况下,你有 2 小时将 receiveTimeout 设置为 2 小时。

由于您不调用Close,WCF 认为会话仍然存在,因此将限制来自新页面的请求,直到旧会话开始超时。 .NET 4 默认会话限制相当高(100 x 核心数),您自己将其设置为 1000,因此在处理运行一段时间之前您不会看到此问题。在某些方面,.NET 3.5 中的默认会话限制在 10 时更好,因为如果您处于您所处的情况,它很快就会变得非常明显

不久前我写了一封关于会议的blog post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2011-11-28
    相关资源
    最近更新 更多