【问题标题】:WCF error - The system hit the limit set for throttle 'MaxConcurrentSessions'WCF 错误 - 系统达到了为油门“MaxConcurrentSessions”设置的限制
【发布时间】:2011-06-12 15:17:10
【问题描述】:

我有一个调用 WCF 服务的 asp.net 应用程序。我一直有一段时间的间歇性超时,所以我决定创建一个跟踪日志。超时后,我在日志文件中发现以下消息:

系统达到了为 节流“MaxConcurrentSessions”。 此油门的限制设置为 10。 油门值可以通过 修改属性 'maxConcurrentSessions' 在 serviceThrottle 元素或通过 修改“MaxConcurrentSessions” 行为属性 ServiceThrottlingBehavior。

问题是我每次都关闭客户端连接,所以我不明白为什么并发会话会增加。下面是我打的一个典型电话:

    try
    {
        //create proxy
        client = new CAEServiceContractClient();

        response = client.GetSecurityRecords(item); 
        totalRecords = response.TotalRecords;

        securityListView.DataSource = response.SecurityItemColl; 
        securityListView.DataBind();

        // Always close the client.
        client.Close();
        success = true;
    }
    finally
    {
        if (!success)
        {
            client.Abort();
        }
    }

所以我的问题是,为什么在我执行 client.Close() 后会话没有被破坏?

TIA。

【问题讨论】:

  • 您使用什么出价方式?发生错误时有多少客户访问您的网站?
  • @Ladislav 我明天会检查,但我很确定它是 wsHttpBinding
  • @Ladislav 我们仍在开发中,所以当错误发生时只有我访问该服务。
  • 如果您的客户关闭不起作用,它可能很容易重现。在单个会话中调用您的服务 10 次。

标签: wcf timeout asp.net-2.0


【解决方案1】:

我没有看到在上面的代码中将success 声明为局部变量,也没有看到您将其设置为false。会不会是班级成员在第一次成功通话时被设置为true,然后保持这种状态?

在任何情况下,整个代码块都可以重写为更易于理解(并且不易出错),如下所示:

using (var client = new CAEServiceContractClient())
{
    response = client.GetSecurityRecords(item); 
    totalRecords = response.TotalRecords;

    securityListView.DataSource = response.SecurityItemColl; 
    securityListView.DataBind();
}

using 语句确保当using 块完成时(正常或异常由于异常),client 变量将被释放(.Dispose() 将被调用),从而关闭连接。

编辑: 正如 Ladislav Mrnka 所指出的,ClientBase.Dispose() 方法在某些情况下有抛出异常的坏习惯。确保按照here 的描述在部分CAEServiceContractClient 类中实现.Dispose() 方法。

【讨论】:

  • @Allon:这是 WCF 反模式! omaralzabir.com/do-not-use-using-in-wcf-client
  • @Ladislav:这不是反模式,它只是 ClientBase 类的糟糕设计(阅读您链接的文章的前三个 cmets)。但是感谢您引起我的注意,我对此一无所知。我还是更喜欢Matt's suggestion
  • @Allon:是的,这个建议是非常好的解决方案。我在发布我的第一条评论时找不到它。这里是官方 MSDN 文章:msdn.microsoft.com/en-us/library/aa355056.aspx
  • @Allon 我已经在上面没有显示的代码块之外声明了“bool success = false”
  • @Ciaran: 如果success 是一个局部变量,那么就有问题了。如果是字段或属性,则需要将其设置为 false。至于try-catch-finally,就足够了,但前提是你做得正确。很容易弄错,为什么我认为using 语句总体上要好得多,特别是 WCF 的ClientBase 更好一些(因为它在处理时抛出异常)。
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 2021-03-25
  • 2018-10-12
  • 2019-05-24
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
相关资源
最近更新 更多