2012-05-11 4 views
0

ImはWCFとクライアントコード内で開発しています。サービスに転送するファイルをファイルストリームで作成します(メッセージでストリームとして送信する)。サービスがストリームを取得した後、彼は平和でそれを読んで、新しいファイルに書き込む。サービスはクライアントから彼にファイルをダウンロードします。私はFileStreamがファイルをメモリにロードする理由を理解しています

ファイルストリームのメソッドReadよりも優先されますので、サービスがにダウンロードされているときに、クライアント側でどれくらい読み込まれたか分かります。

public class FileStreamEx : FileStream 
    { 
     public long _ReadUntilNow { get; private set; } 
     public FileStreamEx(string path, FileMode mode, FileAccess access, FileShare share) 
      : base(path, mode, access, share) 
     { 
      this._ReadUntilNow = 0; 
     } 
     public override int Read(byte[] array, int offset, int count) 
     { 
      int ReturnV = base.Read(array, offset, count); 
      _ReadUntilNow += ReturnV; 
      return ReturnV; 
     } 
    } 

私の目標は、クライアント側からどれだけ毎秒サービスがどれだけ読み込まれたかを知ることです。 これは、サービスがFileStreamExオブジェクトへの参照のみを使用するため、クライアントから_ReadUntilNow値を単に参照することで実装できます。

私の問題は、私が彼に渡したストリーム、_ReadUntilNowの値=ファイルのサイズを読み始めることさえあるということです。これをヘプテンドにするための唯一の方法は、私の優先メソッドを呼び出すことです。

私の質問は、誰かが私にそれを防ぐために何をすればよいのですか?

私のクライアント:

public static void CallService() 
     { 
      ServiceReference1.IJob Service1 = new ServiceReference1.JobClient(new InstanceContext(new CCBImplement())); 
      DLL.FileStreamEx TheStream TheStream = new DLL.FileStreamEx(@"C:\Uploadfiles\Chat.rar", FileMode.Open, FileAccess.Read, FileShare.None); 
      ServiceReference1.RemoteFile RemoteFile1=new ServiceReference1.RemoteFile("Chat.rar", TheStream.Length, @"C:\Uploadfiles\Chat.rar", TheStream); 
      Service1.UselessMethod1(RemoteFile1); 
      new Thread(new ThreadStart(Check_Only_ReadUntilNow_Every_Second)).Start(); 
     } 

サービスコード:

public void UselessMethod1(RemoteFile RemoteFile) 
     { 
      Stream MyStream = RemoteFile.FileByteStream; 
      using (FileStream fs = new FileStream(@"C:\Upload\"+RemoteFile.FileName, FileMode.Create)) 
      { 
       int bufferSize = 1 ; // 1 MB buffer 
       byte[] buffer = new byte[bufferSize]; 
       int totalBytes = 0; 
       int bytes = 0; 
       while ((bytes = MyStream.Read(buffer, 0, bufferSize)) > 0) 
       { 
        fs.Write(buffer, 0, bytes); 
        fs.Flush(); 
        totalBytes += bytes; 
       } 
      } 
     } 

RemoteFileのクラス:そこにあるサイドAの 、:

[MessageContract] 
    public class RemoteFile : IDisposable 
    { 
     [MessageHeader] 
     public string FileName; 

     [MessageHeader] 
     public string Path; 

     [MessageHeader] 
     public long Length; 

     [MessageBodyMember] 
     public Stream FileByteStream; 
     public RemoteFile() { } 
     public RemoteFile(string FileName, string Path, long Length, Stream FileByteStream) 
     { 
      this.Path = Path; 
      this.FileName = FileName; 
      this.Length = Length; 
      this.FileByteStream = FileByteStream; 
     } 
     public void Dispose() 
     { 
      if (FileByteStream != null) 
      { 
       FileByteStream.Close(); 
       FileByteStream = null; 
      } 
     } 
    } 
+0

うん...何ですか?サービスコールの反対側で内部的に起こっている情報を知りたいと思うようです... – Tejs

+0

私はストリームオブジェクトの参照を渡すので、私は知ることができます。 –

+0

あなたはもっと明確になりますか? 「誰か」は誰ですか?どのように読み込みを呼びますか? –

答えて

1

私は彼の質問は、ということだと思いストリームモードでファイルを読み込むメソッドを持つサービスホスト。 B面の には、このサービスを使用してファイルを送信するクライアントがあります。

彼はファイルから読み込んだバイト数を保持する変数を追加するようにFileStreamのcalssを拡張しました。

彼はサイドAのサービスを呼び出しますが、メソッドに到達する前でも余分な変数はファイル全体のサイズを保持しています。これはファイル全体が読み取られたことを意味します。

質問があるのはなぜですか。

+0

そうですね、基本的には:「なぜデータがストリーミングされていないのですか?」 –

+0

。 彼の設定はOKです...転送モードがストリームに設定されています。 –

関連する問題