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;
}

  自己的责任不应由别人来负责。

posted @ 2011-11-28 10:06  PeterQin  阅读(328)  评论(0)    收藏  举报