使WCF客户端静态或使用dispose方法

时间:2017-08-20 08:16:39

标签: asp.net-mvc wcf idisposable wcf-client

我正在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);
    }
}

表演的最佳选择是什么?

1 个答案:

答案 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();
    }
}