我使用以下代码调用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();
我也想知道调用函数的更好方法是哪种。哪种方法会带来更好的表现?
答案 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()
,则不会释放外部资源。
我建议你使用using
和IDisposable
模式,这意味着每次你想要使用服务电话:
using(MyServiceClient proxy = new MyServiceClient())
{
proxy.Func1();
}
保证即使在大括号内出现问题也会释放所有资源。或者您可以使用try, finally
组合手动执行此操作。