我已经将我的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;
}
}
服务配置
答案 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分钟的时间内超时。我关闭了循环内部的连接,所以为什么要一起添加调用