2012-05-11 25 views
0

我在WCF和我的客戶端代碼中開發我創建文件流以傳輸到服務(通過在消息流中發送它)文件。服務到達後,他以和平的方式閱讀和平,並將其寫入新文件;服務將文件從客戶端下載到他,這就是所有。不能理解爲什麼FileStream將文件加載到內存

我重寫了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; 
     } 
    } 

我的目標是從客戶端知道,服務每秒鐘有多少人在這裏得到服務。 這可以通過簡單地從客戶端查看_ReadUntilNow值來實現,因爲該服務僅使用對FileStreamEx對象的引用。

我的問題是,該服務甚至開始讀取我給他的流,_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類:

[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

我認爲他的問題是: 在A側,有服務主機的一種方法是以流模式讀取文件。在B方 ,有一個客戶端使用此服務發送文件。

他擴展了FileStream calss以添加一個變量,該變量包含從文件中讀取的字節數量。

他在A方調用服務,但在它到達方法之前 - 額外變量保存整個文件的大小......這意味着整個文件被讀取。

問題是爲什麼。

+0

對,基本上是這樣的:「數據爲什麼不流式傳輸?」 –

+0

正好。 他的配置沒問題......表示傳輸模式爲流。 –

相關問題