Stream as a return value in WCF - who disposes it?

前端 未结 3 1173
被撕碎了的回忆
被撕碎了的回忆 2020-12-08 02:18

Let\'s say I have the following WCF implementation:

public Stream Download(string path)
{
    FileStream stream = new FileStream(path, FileMode.Open, FileAcc         


        
相关标签:
3条回答
  • 2020-12-08 02:43

    If you wrap the Stream in MessageContract (so you could sent more information in headers), beware that the Stream would not be disposed automatically! As the name of attribute OperationBehavior.AutoDisposeParameters suggests, WCF automatically disposes input/output parameters and thus you have to implement IDisposable on your MessageContract class and close the stream there.

    0 讨论(0)
  • 2020-12-08 02:44

    You can dispose returned stream in WCF like below

    FileStream stream=null;
    OperationContext clientContext = OperationContext.Current;
    clientContext.OperationCompleted += (sender, args) =>
    {
        if (stream != null)
            stream.Dispose();
    };
    
    stream = new FileStream(path, FileMode.Open, FileAccess.Read);
    return stream;
    
    0 讨论(0)
  • 2020-12-08 03:05

    Service is responsible for closing stream and unless you change default behavior it does it automatically (the behavior with defalut values is always used). If you set OperationBehavior.AutoDisposeParameters to false you must register handler for OperationContext.OperationCompleted and dispose the stream in the handler as described here.

    Client cannot close the stream because client has a different one - you are not passing reference to your stream or reference to your file handler. Internally file content is copied to transport and client processes it in its own stream instance (where he is responsible for disposing it).

    0 讨论(0)
提交回复
热议问题