我正在MVC ASP.NET
开发一个使用WCF服务的网站。我在控制器中使用WCF客户端
Public class Home : Controller
{
private ServiceClient _client = new ServiceClient();
public ActionResult Index()
{
//code here
}
}
所以我想到了我必须定义的两个选项:
1-使客户端对象静态
private static ServiceClient _client = new ServiceClient();
2-使用IDisposable.Dispose
Public class Home : Controller, IDisposable
{
private ServiceClient _client = new ServiceClient();
protected override void Dispose(bool disposing)
{
_client.Dispose();
base.Dispose(disposing);
}
}
表演的最佳选择是什么?
答案 0 :(得分:0)
从性能的角度来看,这两个选项都无关紧要。只创建WCF渠道工厂就是性能和价格昂贵的#34;。但是ServiceClient
继承自ClientBase
,它执行通道工厂缓存。因此创建客户端既便宜又实际上是正确的方法:创建客户端,使用它,立即处理它。
因此,第二个选项是正确的,如果不是WCF客户端设计中的缺陷。该缺陷导致您不能依赖客户端的Dispose
方法来正确处理通道的故障状态。这个问题肯定已经在SO的其他地方得到了解决。但简而言之,这就是我通常如何创建和部署WCF客户端:
var client = new ServiceClient();
var success = false;
try
{
// call client's methods
client.Close();
success = true;
}
finally
{
if (!success)
{
client.Abort();
}
}