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獲取該信息的一些簡單方法。
發送的文件末尾的標誌是什麼,我試圖避免。
是的,和它的作品。但是隨着這一點,服務器必須將所有數據保存在內存中。 – ByteArtisan
不,它不。當內部緩衝區填滿時,文件流將刷新到磁盤。還有一個可以指定緩衝區大小的CopyTo重載。 – gnud
你是Rigth。根據它的文件。 由於客戶端試圖分配內存中的所有文件,所以仍然無法傳遞6GB文件,但這是另一個問題。謝謝。 – ByteArtisan