我有一个调用WCF服务的asp.net应用程序。我一直在间歇性超时一段时间,所以我决定创建一个跟踪日志。在超时后,我在日志文件中找到了以下消息:
系统达到了设定的限制 节流'MaxConcurrentSessions'。 此油门的限制设置为10。 节气门值可以改变 修改属性 'maxConcurrentSessions'中 serviceThrottle元素或by 修改'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。
答案 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指出的那样,.Dispose()
ClientBase
方法有一种习惯,即在某些情况下会抛出异常。请务必按照here所述,在部分.Dispose()
课程中实施CAEServiceContractClient
方法。