无法在WCF中访问已处置的对象例外

时间:2013-09-23 18:24:01

标签: .net wcf

我使用以下代码调用WCF服务方法

MyServiceClient proxy = new MyServiceClient();
proxy.Open();
proxy.Func1();
proxy.Close();
// Some other code
proxy.Open();
proxy.Func2();

proxy.Close();

第二次调用'proxy.Open()'时出现异常,但有时代码有效。我也可以使用下面显示的以下代码,它可以正常工作。

MyServiceClient proxy = new MyServiceClient();

proxy.Func1();

// Some other code

proxy.Func2();

proxy.Close();

我也想知道调用函数的更好方法是哪种。哪种方法会带来更好的表现?

4 个答案:

答案 0 :(得分:7)

关闭连接后,您无法重复使用它。

您需要在此时制作新的MyServiceClient

MyServiceClient proxy = new MyServiceClient();
proxy.Open();
proxy.Func1();
proxy.Close();

// Some other code

proxy = new MyServiceClient(); // Recreate the client here
proxy.Open();
proxy.Func2();
proxy.Close();

答案 1 :(得分:3)

WCF是.NET框架中少数几个实例(可能只是实例)之一,您应该 NOT using语句与实现IDisposable的类一起使用。这个MSDN Article解释了使用服务引用的正确模式。这也适用于从Channel创建的ChannelFactory个实例。

答案 2 :(得分:0)

在多次通话中使用相同的代理

MyServiceClient proxy = new MyServiceClient();
proxy.Open();
proxy.Func1();

// Some other code

proxy.Func2();
proxy.Close();

答案 3 :(得分:0)

正如其他人已经提到的那样,您应该在调用Close()方法后担心确定性释放资源,但如果在Exception方法中出现Func1,2(),则不会释放外部资源。

我建议你使用usingIDisposable模式,这意味着每次你想要使用服务电话:

using(MyServiceClient proxy = new MyServiceClient())
{
    proxy.Func1();
}

保证即使在大括号内出现问题也会释放所有资源。或者您可以使用try, finally组合手动执行此操作。