WCF -- File Transfer with Stream -- Dispose your Stream
周末看了WCF 传文件:
于是Server 端写了一个Download function:
public ResponseFileInfo DownloadFileWithMsgContract(RequestFileInfo aFileInfo)
{
string strFileName = aFileInfo.FileName;
Stream streamContent = File.OpenRead(strFileName);
ResponseFileInfo fileInfo = new ResponseFileInfo(strFileName, streamContent.Length, streamContent);
return fileInfo;
}
其它的代码就不贴出来了,ResponseFileInfo 和 RequestFileInfo 是兩個 MessageContract 。實現了Client Size 之後的確可以Download file, 但Stream 卻沒有Close (就算在Client那邊的Code, 把來自Service 的Stream Close都沒有用)。
注:当我直接让DownloadFile function return 一个Stream 给Client 时,不会出现这样的问题。
於是Google it,才發現原來可以用OperationContext的Complete Event 去Close掉Server 的Stream。
public ResponseFileInfo DownloadFileWithMsgContract(RequestFileInfo aFileInfo)
{
string strFileName = aFileInfo.FileName;
Stream streamContent = File.OpenRead(strFileName);
OperationContext clientContext = OperationContext.Current;
clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args)
{
if (streamContent != null)
{
streamContent.Dispose();
}
});
ResponseFileInfo fileInfo = new ResponseFileInfo(strFileName, streamContent.Length, streamContent);
return fileInfo;
}
自己的责任不应由别人来负责。

浙公网安备 33010602011771号