在循环中调用操作时的WCF超时

时间:2009-07-08 07:58:39

标签: c# wcf

我已经将我的wcf客户端包装在一个IDisposable包装器中,一切似乎都正常工作,我有一个测试用例在大约10次后运行x次我开始超时

调用代码将帮助器包装在using语句中,所以tbh我有点亏本

有人对此有所了解吗?

public class CrmServiceHelper : IDisposable
{
    private CrmServices.CRMServicesClient client;

    public CrmServices.CRMServicesClient GetClient
    {
        get
        {
            lock (this)
            {
                if (client == null)
                    client = new CrmServices.CRMServicesClient();
            }
            return client;
        }
    }
    public void Dispose()
    {
        try
        {
            client.Close();
        }
        catch (CommunicationException ex)
        {
            client.Abort();
        }
        catch (TimeoutException ex)
        {
            client.Abort();
        }
    }
}

示例使用代码:

    using (CrmServiceHelper client = new CrmServiceHelper())
    {
        AListReponse resp = client.GetClient.GetAList(companyId);
        if ((resp != null) && (resp.AList != null))
        {
            return resp.AList ;
        }
        else
        {
            return null;
        }
    }

服务配置

                                                                                                                                                                                       

3 个答案:

答案 0 :(得分:2)

大概10次....几乎听起来好像你正在达到服务器限制限制....也许你没有正确关闭你的客户端代理?客户端会话闲逛,服务不接受任何新的传入请求?

您的服务托管如何? IIS?自托管?您使用的是每次呼叫模型还是基于会话的呼叫?

您能告诉我们服务器端配置以及托管服务的代码(如果您是自托管的话)。这可能有助于我们找到理由。

马克

<强>更新
如果您使用的是“开箱即用 - 无变化”模式,您将拥有wsHttpBinding,并且您将使用基于会话的方法。默认情况下,该服务最多限制为10个会话。

你可以做两件事:

1)您可以更改服务器端的服务限制行为,以允许一次超过10个会话:

   <behaviors>
      <serviceBehaviors>
        <behavior name="Throttled">
          <serviceThrottling 
            maxConcurrentCalls="25" 
            maxConcurrentSessions="25" 
            maxConcurrentInstances="25" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

请注意,这会给您的服务器带来更多压力 - 您不想过高......

2)您可以通过使用此属性装饰您的服务实现,将呼叫模式更改为“按次呼叫”:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
class YourService : IYourService
{
 ......
}

但是即使在这种情况下,服务限制可能会启动 - 默认情况下服务限制为16个并发调用 - 您可能需要增加(并且MaxInstances也增加到相同的数字)。

答案 1 :(得分:0)

我没有看到代码有什么问题(虽然我先测试null,然后再进行锁定,除了锁定之后)。

也许问题不在于客户端,而在于服务?

答案 2 :(得分:0)

        for (int j = 0; j < 100; j++)
        {
            using (var client = new ServiceClient())
            {
                client.Method();
            }
         }

我用这段代码抽出时间。通话需要1秒钟,但是在60次通话后,它会在1分钟的时间内超时。我关闭了循环内部的连接,所以为什么要一起添加调用