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を解放する責任があるのは誰であるかをどうやって知ることができますか?

編集:コードが「using」ブロック内に配置されている場合、クライアントが何かを受信する前にストリームがシャットダウンされます。

4

3 に答える 3

6

クライアントではなく、サービスがクリーンアップする必要があります。OperationBehaviorAttribute.AutoDisposeParameters の WCF のデフォルトは 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

ストリームは、それを読む責任がある当事者によって閉じられる必要があります。たとえば、サービスがクライアントにストリームを返す場合、クライアントがストリームの読み取りを終了したときに、サービスが認識または制御できないため、ストリームを閉じるのはクライアント アプリケーションの責任です。また、受信側がいつ読み取りを終了したかがわからないため、WCF はストリームを再度閉じる処理を行いません。:)

HTH、アミット・バティア

于 2012-11-14T19:57:05.603 に答える
0

簡単な答え:usingブロックを介した呼び出しコード。

長い答え: サンプル コードは、優れた実践例として決して保持されるべきではありません。非常に具体的な概念を説明するためだけに存在します。実際のコードにはtryそのようなブロックはありません。コードに価値はありません。エラーは、深さではなく、最上位レベルでログに記録する必要があります。そのことを念頭に置くと、サンプルは単一の式 になり、それを必要とするブロックFile.OpenRead(filePath)に単純に差し込まれます。using

更新(より多くのコードを見た後):

関数からストリームを返すだけで、WCF はいつ破棄するかを決定します。

于 2012-11-14T19:26:08.467 に答える