ASP.net页面中的WCF服务参考 - 何时处理?

时间:2010-08-31 16:44:55

标签: asp.net wcf

我有一个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事件上做这件事。

有更好的方法吗?

2 个答案:

答案 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作为其非常重的性能