我们有一个使用流传递大型对象的合同。服务和消息合同归结为这样的事情。
[ServiceContract]
public interface IData
{
[OperationContract]
Item Get(ItemRequest request);
[OperationContract]
void Put(Item request);
}
[MessageContract]
public class Item: IDisposable
{
[MessageBodyMember(Order = 1)]
public Stream FileByteStream;
public void Dispose() {...}
}
Item类提供了Disposable模式的标准实现。我的问题是WCF调用Item类的Dispose方法。通过ServiceHost的WCF基本上负责从我们的服务合同实现中传递和接收Item对象。
网上有很多例子(例如this),但是如果它们发生的话,它们都不会被称为处置或提及。
答案 0 :(得分:5)
WCF没有承担责任"对象。 WCF只是序列化您在一侧传递给它的对象,并在另一侧创建一个新对象。
WCF真的没有任何东西可以拥有...所以我不确定为什么你会认为WCF有任何理由处理传递给它的对象。
通常,你会做这样的事情:var proxy = new MyService();
var myobject = new MyObject();
proxy.Send(myobject);
// here myobject is still alive, and you can still do things with it..
编辑:
我发现你实际上是在谈论服务的返回值。在这种情况下,是..默认情况下,WCF将对传入的参数和返回的参数调用dispose。但是,这由OperationBehaviorAttribute.AutoDisposeParameters属性控制,该属性默认为true。
如果将此值设置为false,则负责调用dispose,通常在OperationContext.OperationCompleted事件处理程序中。