2010-08-31 71 views
2

我有一个ASP.net页面创建一个WCF服务的服务引用,并在我的页面的多个地方拨打电话。我实例在Page_Load中的服务引用,并有一个实例变量来存储它:ASP.net页面中的WCF服务参考 - 何时处理?

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

根据MSDN文档和个人经验做一些事情如下:

try 
{ 
    ... 
    client.Close(); 
} 
catch (CommunicationException e) 
{ 
    ... 
    client.Abort(); 
} 
catch (TimeoutException e) 
{ 
    ... 
    client.Abort(); 
} 
catch (Exception e) 
{ 
    ... 
    client.Abort(); 
    throw; 
} 

这将允许服务的正确关闭或流产必要的时候,而不是让他们在预定的时间进行配置 - 只保留连接打开,只要你肯定不得不。个人而言,我不喜欢在性能自IDisposable继承其非常重

+0

为什么继承'IDisposable'性能很重? – 2010-08-31 17:13:38

+0

所以你建议我在每种需要访问数据的方法中打开一个频道?这在表现上似乎相当重要。 – Dismissile 2010-08-31 17:17:18

+0

@Dismissile - 为什么打开连接而不是在需要时打开它?如果数据库没有被使用,你会保持与数据库的连接吗?当然,目标是在可能的情况下保持连接免费使用,因此只在必要时才打开.WCF服务可以在Dispose()上抛出异常,因此垃圾收集器将不得不清理连接。如果代码看起来很难看,那么确保它可以被重新考虑以保持代码DRY – stack72 2010-08-31 20:33:45

1

就个人而言,我会在Page_Load但在做Web服务调用的方法打开FooClient当我需要它,所以。这样,你确切知道它会发生什么。我通常采取如下方法:

var client = OpenClient(); 
try 
{ 
    // Perform operation(s) on client. 
} 
finally 
{ 
    CloseClient(client); 
} 

这样,你确信你关闭你的代理,无论发生什么事(如果有需要捕捉异常,只需添加一个catch子句)。 CloseClient方法应该看起来像PaulStack的答案。

当你这样做的另一个好处是,多次通话不会互相干扰。假设您的其中一个Web服务调用导致意外的异常。客户端通道现在处于故障状态,因此不能用于其他任何呼叫。

第三,假设发生了一个你不能捕捉或不想捕捉的异常,我不确定Page_Unload是否实际被调用(并且我不知道在那个事件中将调用哪个页面方法) 。这也将使连接打开。