WCF Streaming - 谁关闭文件?

时间:2012-11-14 18:22:47

标签: wcf streaming

根据微软的样本,以下是如何通过WCF流​​式传输文件:

   // Service class which implements the service contract
    public class StreamingService : IStreamingSample
    {

        public System.IO.Stream GetStream(string data)
        {
            //this file path assumes the image is in
            // the Service folder and the service is executing
            // in service/bin 
            string filePath = Path.Combine(
                System.Environment.CurrentDirectory,
                ".\\image.jpg");
            //open the file, this could throw an exception 
            //(e.g. if the file is not found)
            //having includeExceptionDetailInFaults="True" in config 
            // would cause this exception to be returned to the client
            try
            {
                FileStream imageFile = File.OpenRead(filePath);
                return imageFile;
            }
            catch (IOException ex)
            {
                Console.WriteLine(
                    String.Format("An exception was thrown while trying to open file {0}", filePath));
                Console.WriteLine("Exception is: ");
                Console.WriteLine(ex.ToString());
                throw ex;
            }
        }
...

现在,我怎么知道转移完成后谁负责释放FileStream?

编辑:如果代码放在“使用”块中,则流会在客户端收到任何内容之前关闭。

3 个答案:

答案 0 :(得分:6)

该服务应该清理而不是客户端。对于OperationBehaviorAttribute.AutoDisposeParameters,WCF的默认值似乎是正确的,因此它应该为您进行处理。虽然似乎没有一个固定的答案。

您可以尝试使用OperationContext.OperationCompleted Event

OperationContext clientContext = OperationContext.Current;
clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args)
   {
      if (fileStream != null)
         fileStream.Dispose();
   });

在你回来之前把它。

选中此blog

答案 1 :(得分:0)

简答:调用代码,通过using块。

答案很长:示例代码永远不应该被视为良好实践的典范,它仅用于说明一个非常具体的概念。真正的代码永远不会有try这样的块,它不会给代码增加任何价值。错误应记录在最顶层,而不是深入。考虑到这一点,样本成为单个表达式File.OpenRead(filePath),只需将其插入需要它的using块中。

更新(看到更多代码后):

只需从函数返回流,WCF将决定何时处理它。

答案 2 :(得分:0)

该流需要由负责阅读它的一方关闭。例如,如果服务将流返回给客户端,则客户端应用程序负责关闭流,因为服务在客户端完成读取流时不知道或无法控制。此外,WCF不会再次关闭流,因为它不知道接收方何时完成阅读。 :)

HTH, 阿米特巴蒂亚