如何关闭WCF连接
2011-01-22 00:12
155 查看
本文让你可以看到如何正确地关闭这些通信的连接。
如果你使用过Visual Studio为WCF服务生成WCF代理类,那么现在来看看里面生成的客户端类:
public partial class StockServiceClient : System.ServiceModel.ClientBase<StockService.IStockService>, StockService.IStockService {
...
复制代码
客户端使用的主要代码继承自ClientBase<>,在MSDN看到它实现了IDisposable接口。与大多数实现IDisposable接口的类一样,为WCF客户端使用C#的using声明将是吸引人的。
// 虽然很棒,但不能这样写:
using(StockService.StockServiceClient client = new StockService.StockServiceClient(
"StockBasicHttpEndpoint", stockServiceUrl))
{
client.GetStockIdByName("MSFT");
}
复制代码
如你所知,这样使用将在通信完成后自动调用client.Dispose()方法。这样就有一个问题,通过ClientBase类的Dispose()方法调用了Close()方法。当ClientBase类的Close()方法被调用后,Web服务实际上停止了WCF服务并通知它连接会话已不再需要保持。这似乎违反常理,但确实发生了。这个问题的解决办法是当Close()方法被调用后能抛出一个异常。毕竟,它涉及的是对Web服务的另一个网络调用。正因为如此,在WCF客户端是不推荐使用using声明的。
相反,你应该尝试在一个try-catch代码块执行Close()方法,在catch里执行Abort()方法。
//正常调用Web服务.
StockService.StockServiceClient client = new StockService.StockServiceClient(
"StockBasicHttpEndpoint", stockServiceUrl);
string StockId = client.GetStockIdByName("MSFT");
//服务完成后,使它关闭
try
{
if (client.State != System.ServiceModel.CommunicationState.Faulted)
{
client.Close();
}
}
catch (Exception ex)
{
client.Abort();
}
复制代码
如果你使用完全相同的关闭代码,那么上述解决方法也适用于ChannelFactory类。
//从工厂创建通道channel实例
ChannelFactory channel =
new ChannelFactory<IService1>("bindingName");
IService1 client = channel.CreateChannel();
client.DoWork();
//服务完成后,使它关闭
try
{
if (client.State != System.ServiceModel.CommunicationState.Faulted)
{
client.Close();
}
}
catch (Exception ex)
{
client.Abort();
}
复制代码
就这些,非常简单。不要对WCF的client类使用'using';在try-catch块里调用Close()方法关闭客户端,异常发生后调用Abort()方法。
英文链接:Closing your WCF Connections properly
如果你使用过Visual Studio为WCF服务生成WCF代理类,那么现在来看看里面生成的客户端类:
public partial class StockServiceClient : System.ServiceModel.ClientBase<StockService.IStockService>, StockService.IStockService {
...
复制代码
客户端使用的主要代码继承自ClientBase<>,在MSDN看到它实现了IDisposable接口。与大多数实现IDisposable接口的类一样,为WCF客户端使用C#的using声明将是吸引人的。
// 虽然很棒,但不能这样写:
using(StockService.StockServiceClient client = new StockService.StockServiceClient(
"StockBasicHttpEndpoint", stockServiceUrl))
{
client.GetStockIdByName("MSFT");
}
复制代码
如你所知,这样使用将在通信完成后自动调用client.Dispose()方法。这样就有一个问题,通过ClientBase类的Dispose()方法调用了Close()方法。当ClientBase类的Close()方法被调用后,Web服务实际上停止了WCF服务并通知它连接会话已不再需要保持。这似乎违反常理,但确实发生了。这个问题的解决办法是当Close()方法被调用后能抛出一个异常。毕竟,它涉及的是对Web服务的另一个网络调用。正因为如此,在WCF客户端是不推荐使用using声明的。
相反,你应该尝试在一个try-catch代码块执行Close()方法,在catch里执行Abort()方法。
//正常调用Web服务.
StockService.StockServiceClient client = new StockService.StockServiceClient(
"StockBasicHttpEndpoint", stockServiceUrl);
string StockId = client.GetStockIdByName("MSFT");
//服务完成后,使它关闭
try
{
if (client.State != System.ServiceModel.CommunicationState.Faulted)
{
client.Close();
}
}
catch (Exception ex)
{
client.Abort();
}
复制代码
如果你使用完全相同的关闭代码,那么上述解决方法也适用于ChannelFactory类。
//从工厂创建通道channel实例
ChannelFactory channel =
new ChannelFactory<IService1>("bindingName");
IService1 client = channel.CreateChannel();
client.DoWork();
//服务完成后,使它关闭
try
{
if (client.State != System.ServiceModel.CommunicationState.Faulted)
{
client.Close();
}
}
catch (Exception ex)
{
client.Abort();
}
复制代码
就这些,非常简单。不要对WCF的client类使用'using';在try-catch块里调用Close()方法关闭客户端,异常发生后调用Abort()方法。
英文链接:Closing your WCF Connections properly
相关文章推荐
- TCP如何能正常关闭连接?
- 如何解决mysql数据库8小时无连接自动关闭
- golang的垃圾回收与Finalizer——tcp连接是如何被自动关闭的
- WCF分布操作-如何判断通道关闭并再次创建通道
- Android 数据连接关闭的情况下如何让彩信发不出去
- 当客户端socket关闭时,select模型的server端该如何完美的释放掉连接的socket? [问题点数:100分,结帖人guopo]
- WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭
- 如何解决mysql数据库8小时无连接自动关闭
- WCF 基础连接已经关闭: 接收时发生错误
- WCF远程服务器强制关闭了一个连接
- WCF分布式开发常见错误(2)无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接
- Netstat命令详解 如何关闭TIME_WAIT连接 如何查看nginx的访问流量
- 如何更好的关闭数据库连接?(ASP.NET)
- wcf 基础连接已经关闭: 连接被意外关闭
- 在WINDOWS95&WINDOWS98下如何关闭网络连接
- 用tcpdump 分析如何建立与关闭tcp连接 - 邓维 - 博客园
- 如何解决FtpWebRequest基础连接已经关闭;接收时发生错误(ZZ)
- (转)利用lambda表达式正确关闭WCF连接
- Java学习笔记--------Socket-------如何控制连接关闭
- [FAQ03982]数据连接关闭的情况下如何让彩信发不出去