为什么在DataContract上调用Dispose,即使该服务仍然引用它?

Naw*_*waz 10 c# wcf idisposable datacontract

我定义了以下DataContract实现IDisposable:

[DataContract]
public class RegularFileMetadata : FileMetadataBase, IDisposable
{
   bool _Disposed = false; //note this!

   //...

   protected virtual void Dispose(bool disposing)
   {
      if (!_Disposed)
      {
          //...
          _Disposed = true; //note this too!
      }
   }
   public void Dispose()
   {
      Dispose(true);
      GC.SuppressFinalize(this);
   }
}
Run Code Online (Sandbox Code Playgroud)

我调用以下服务方法传递上述数据协定的实例:

[OperationContract]
[ServiceKnownType(typeof(RegularFileMetadata))]
Guid BeginUpload(FileMetadataBase metadata);
Run Code Online (Sandbox Code Playgroud)

在实现中BeginUpload,我只是将字典中的元数据保存为:

Dictionary<Guid, RegularFileMetadata> _Dict;

public Guid BeginUpload(FileMetadataBase fileMetadata)
{
    //...
    var metadata = fileMetadata as RegularFileMetadata; 
    Guid sessionId = Guid.NewGuid();
    _Dict.Add(sessionId, metadata); //metadata SAVED!
    return sessionId ;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在从这个方法返回之后,Dispose()即使我已经在字典中保存了实例,为什么会被调用_Dict

我已经验证Dispose()方法被调用在同一我已经保存在我的字典实例,如_Disposed变成true保存对象,即_Dict[sessionId]._Disposed变成true!

我的服务的服务行为设置为:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 15

它被处置因为该对象"属于"WCF - 它凭空创建了对象实例,作为参数传递给您的方法.而且,它足以观察到这个对象的实现IDisposable,所以它会在你的方法完成后处理掉它.

如果您希望在方法完成后挂起此对象的实例,则需要自己创建此类实例,将相关详细信息从一个实例复制到另一个实例.

Dispose()即使我已经在字典中保存了实例,为什么被调用_Dict

因为Dispose模式与引用和垃圾收集无关.重要的是,每当在多个方法/演员/代理之间传递对一次性对象的引用时,就"谁"负责呼叫Dispose以及何时进行协议.在这种情况下,"谁"是WCF基础结构.


更正 - 您可以通过将OperationBehavior属性添加到方法并设置AutoDisposeParameters为false 来更改此行为:

[OperationBehavior(AutoDisposeParameters=false)]
public Guid BeginUpload(FileMetadataBase fileMetadata)
{
    //...
    var metadata = 
Run Code Online (Sandbox Code Playgroud)