我有一个简单的WCF服务,它公开一个REST端点,并从BLOB容器中获取文件。该服务将文件作为流返回。我发现了这篇关于在回复之后关闭流的帖子:
http://devdump.wordpress.com/2008/12/07/disposing-return-values/
这是我的代码:
public class FileService
{
[OperationContract]
[WebGet(UriTemplate = "{*url}")]
public Stream ServeHttpRequest(string url)
{
var fileDir = Path.GetDirectoryName(url);
var fileName = Path.GetFileName(url);
var blobName = Path.Combine(fileDir, fileName);
return getBlob(blobName);
}
private Stream getBlob(string blobName)
{
var account = CloudStorageAccount.FromConfigurationSetting("ConnectingString");
var client = account.CreateCloudBlobClient();
var container = client.GetContainerReference("data");
var blob = container.GetBlobReference(blobName);
MemoryStream ms = new MemoryStream();
blob.DownloadToStream(ms);
ms.Seek(0, SeekOrigin.Begin);
return ms;
}
}
所以我有两个问题:
(我的客户端是Silverlight 4.0,以防它有任何影响)
答案 0 :(得分:0)
我会考虑将您的退货类型更改为byte[]
。它更整洁。
Stream
实现了IDisposable
,因此从理论上讲,您的方法的使用者需要在using
块中调用您的代码:
using (var receivedStream = new FileService().ServeHttpRequest(someUrl))
{
// do something with the stream
}
如果您的客户肯定需要访问Stream
提供的内容,那么请务必继续并返回该内容,但是通过返回byte[]
,您可以控制隐藏在其下的任何非托管资源。覆盖。
答案 1 :(得分:0)
默认情况下,OperationBehaviorAttribute.AutoDisposeParameters设置为TRUE,它在所有可丢弃的输入/输出上调用dispose。所以一切正常。
这个链接:
http://devdump.wordpress.com/2008/12/07/disposing-return-values/
解释了如何手动控制过程。