7

我正在使用以下代码调用 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

4 回答 4

9

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

那时你需要做一个新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();
于 2013-09-23T18:30:10.087 回答
4

WCF 是 .NET 框架中为数不多的实例之一(可能是唯一的实例),您不应语句using与实现IDisposable. 这篇MSDN 文章解释了使用服务引用的正确模式。这也适用于ChannelChannelFactory.

于 2013-09-23T20:50:34.860 回答
0

在多个呼叫中使用相同的代理

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

// Some other code

proxy.Func2();
proxy.Close();
于 2013-09-23T18:40:22.877 回答
0

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

我建议您使用usingIDisposable模式,这意味着每次您要进行服务调用时使用:

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

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

于 2013-09-23T19:21:08.033 回答