WCF Streaming (串流) 允許接收端在訊息尚未完整接收時即開始處理,大幅降低大型訊息 (圖片、影片、報表) 的記憶體佔用與延遲。預設 Buffered 模式需完整緩衝後再處理,易造成 OOM 或長時間阻塞。
transferMode:Streamed (雙向)、StreamedRequest、StreamedResponse。maxReceivedMessageSize。<basicHttpBinding>
<binding name="streamedBinding" transferMode="Streamed"
maxReceivedMessageSize="20000000" />
</basicHttpBinding>
串流操作的參數或回傳值 只能有一個 且型別為 Stream 或其衍生類 (MemoryStream、FileStream 不可序列化,勿直接用作參數)。
[ServiceContract]
public interface IFileService
{
[OperationContract]
Stream DownloadFile(string fileName); // 回傳串流
[OperationContract]
void UploadFile(Stream fileStream); // 參數串流
[OperationContract(IsOneWay = true)]
void UploadFileOneWay(Stream fileStream); // 單向上傳
}
public Stream DownloadFile(string fileName)
{
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
var bytes = File.ReadAllBytes(path); // 示範用;大檔案建議 File.OpenRead 直接回傳 FileStream
return new MemoryStream(bytes);
}
public void UploadFile(Stream stream)
{
using (var fs = File.Create("uploaded.dat"))
{
stream.CopyTo(fs); // .NET 4+ 直接複製串流
}
}
receiveTimeout (預設 10 分鐘) 被斷開。解法:調大 receiveTimeout 或改用 Buffered 模式傳輸小檔案。MemoryStream 或自訂 Stream 實作 IXmlSerializable。reliableSession enabled="true" 不相容於 transferMode="Streamed"。.NET Core / ASP.NET Core 原生支援 IAsyncEnumerable<byte[]>、FileStreamResult、gRPC 串流,效能與跨平台優於 WCF Streaming,建議新專案採用。