5

根据 Microsoft 的示例,以下是通过 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?

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

4

3 回答 3

6

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

您可以尝试使用OperationContext.OperationCompleted Event

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

把它放在你回来之前。

检查这个博客

于 2012-11-15T14:07:04.600 回答
0

简短的回答:调用代码,通过一个using块。

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

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

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

于 2012-11-14T19:26:08.467 回答
0

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

HTH,阿米特·巴蒂亚

于 2012-11-14T19:57:05.603 回答