2016-12-06 70 views
0

我的網頁方法接收簡單的結構,其中,所述字段中的一個是流WCF服務EndOfStream。 它是這樣的:在流場檢測上使用流式傳輸的消息(MTOM)

[MessageContract] 
public class MyFile:IDisposable 
{ 
    Stream _stream; 
    [MessageBodyMember] 
    public Stream stream 
    { 
     get { return _stream; } 
     set { _stream= value; } 
    } 

    String _Name; 
    [MessageHeader] 
    public String Name 
    { 
     get { return _Name; } 
     set { _Name = value; } 
    } 
} 
#region IDisposable Support 
private bool disposedValue = false; // To detect redundant calls 

protected virtual void Dispose(bool disposing) 
{ 
    if (!disposedValue) 
    { 
     if (disposing) 
     { 
      // TODO: dispose managed state (managed objects). 
      _File.Dispose(); 
     } 

     // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below. 
     // TODO: set large fields to null. 

     disposedValue = true; 
    } 
} 
public void submitFile(MyFile file) 
{ 
    using (var fs = File.Create(@"d:\temp\" + file + ".pdf")) 
    { 
     int len; 
     byte[] buffer = new byte[1024]; 
     do 
     { 
      len = file.stream.Read(buffer,0,buffer.Length); 
      fs.Write(buffer, 0, len); 
     } while (len != 0); 
    } 
} 

此代碼會導致在客戶端的錯誤。當客戶端仍然通過數據流發送數據時,客戶端會放棄說服務器關閉數據流。

問題是如何檢測流的末尾?

我知道通信可以暫停,或者服務器可以處理的速度比客戶快,所以沒有要讀取的數據並不意味着客戶端已經發送了所有的數據。 Http post在結束時應該有一些標記,告訴服務器請求已經結束,所以應該是WCF獲取該信息的一些簡單方法。

發送的文件末尾的標誌是什麼,我試圖避免。

回答

1

您是否嘗試過使用最簡單的解決方案?

  file.stream.CopyTo(fs); 
+0

是的,和它的作品。但是隨着這一點,服務器必須將所有數據保存在內存中。 – ByteArtisan

+1

不,它不。當內部緩衝區填滿時,文件流將刷新到磁盤。還有一個可以指定緩衝區大小的CopyTo重載。 – gnud

+0

你是Rigth。根據它的文件。 由於客戶端試圖分配內存中的所有文件,所以仍然無法傳遞6GB文件,但這是另一個問題。謝謝。 – ByteArtisan