.net 无法访问WCF中已处理的对象异常

.net 无法访问WCF中已处理的对象异常,.net,wcf,.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

我使用以下代码调用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();

我还想知道调用函数的更好方法是什么。哪种方法可以提供更好的性能?

一旦关闭连接,就不能重用它

此时,您需要创建一个新的
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();

在多个调用上使用同一代理

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

// Some other code

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

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

我建议您使用
使用
IDisposable
模式,这意味着您每次要拨打服务电话时都要使用:

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

这保证了即使大括号中出现问题,所有资源都将被释放。或者您可以使用
try,finally
组合手动执行此操作。

WCF是.NET framework中为数不多的实例之一(可能是唯一的实例),您不应该
using
语句与实现
IDisposable
的类一起使用。这解释了使用服务引用的正确模式。这也适用于从
ChannelFactory

创建的
Channel
实例。也许您只是为了简化而删除了它,但您应该使用
finally
来确保始终关闭打开的资源。Geeze Louise。我同意,这是我见过微软写这篇关于避免使用声明的文章的唯一地方System.ObjectDisposedException'无法访问已处置的对象。对象名称:“System.ServiceModel.Channel.ServerSessionPreambleConnectionReader+ServerFramingDuplexSessionChannel”。位于System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen()的System.ServiceModel.Channels.OutputChannel.Send(消息消息,TimeSpan超时)的System.ServiceModel.Channels.RequestContextBase.Reply(消息消息,TimeSpan超时)