我有一个ASP.net页面,它正在创建对WCF服务的服务引用,并在我的页面中的多个位置进行调用。我在Page_Load中实例化服务引用,并有一个实例变量来存储它:
private FooClient _serviceClient;
protected void Page_Load(object sender, EventArgs e)
{
_serviceClient = nwe FooClient();
_serviceClient.GetAllFoos();
}
protected void btnSave_Click(object sender, EventArgs e)
{
_serviceClient.SaveFoo();
}
我刚刚发现在使用它时我需要处理服务引用,否则连接将保持活动状态,如果达到最大连接数,将阻止传入连接。处理这些参考资料的最佳地点在哪里?我想在OnUnLoad事件上做这件事。
有更好的方法吗?
答案 0 :(得分:1)
就个人而言,我会在需要时打开FooClient
,因此{em>不在<{1}} ,而是在进行网络服务调用的方法中。这样,您就可以确切地知道它发生了什么。我通常采用以下方法:
Page_Load
通过这种方式,您可以确保关闭代理,无论发生什么(如果您需要捕获异常,只需添加catch子句)。 var client = OpenClient();
try
{
// Perform operation(s) on client.
}
finally
{
CloseClient(client);
}
方法应该与PaulStack的答案相似。
执行此操作时获得的另一个好处是多个呼叫不会互相干扰。假设您的某个Web服务调用导致意外异常。客户端通道现在处于故障状态,因此无法用于任何其他呼叫。
第三,假设发生了一个你无法捕获或不想捕获的异常,我不确定CloseClient
是否实际被调用(我不知道将调用哪个页面方法)那个事件)。这也将使连接保持打开状态。
答案 1 :(得分:0)
根据MSDN文档和个人经验做如下事情:
try
{
...
client.Close();
}
catch (CommunicationException e)
{
...
client.Abort();
}
catch (TimeoutException e)
{
...
client.Abort();
}
catch (Exception e)
{
...
client.Abort();
throw;
}
这将允许在必要时正确关闭或中止服务,而不是让它们在预定义的时间处理 - 只要你肯定必须保持连接打开。我个人不喜欢继承IDisposable作为其非常重的性能