根据微软的样本,以下是如何通过WCF流式传输文件:
// Service class which implements the service contract
public class StreamingService : IStreamingSample
{
public System.IO.Stream GetStream(string data)
{
//this file path assumes the image is in
// the Service folder and the service is executing
// in service/bin
string filePath = Path.Combine(
System.Environment.CurrentDirectory,
".\\image.jpg");
//open the file, this could throw an exception
//(e.g. if the file is not found)
//having includeExceptionDetailInFaults="True" in config
// would cause this exception to be returned to the client
try
{
FileStream imageFile = File.OpenRead(filePath);
return imageFile;
}
catch (IOException ex)
{
Console.WriteLine(
String.Format("An exception was thrown while trying to open file {0}", filePath));
Console.WriteLine("Exception is: ");
Console.WriteLine(ex.ToString());
throw ex;
}
}
...
现在,我怎么知道转移完成后谁负责释放FileStream?
编辑:如果代码放在“使用”块中,则流会在客户端收到任何内容之前关闭。
答案 0 :(得分:6)
该服务应该清理而不是客户端。对于OperationBehaviorAttribute.AutoDisposeParameters,WCF的默认值似乎是正确的,因此它应该为您进行处理。虽然似乎没有一个固定的答案。
您可以尝试使用OperationContext.OperationCompleted Event:
OperationContext clientContext = OperationContext.Current;
clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args)
{
if (fileStream != null)
fileStream.Dispose();
});
在你回来之前把它。
选中此blog
答案 1 :(得分:0)
简答:调用代码,通过using
块。
答案很长:示例代码永远不应该被视为良好实践的典范,它仅用于说明一个非常具体的概念。真正的代码永远不会有try
这样的块,它不会给代码增加任何价值。错误应记录在最顶层,而不是深入。考虑到这一点,样本成为单个表达式File.OpenRead(filePath)
,只需将其插入需要它的using
块中。
更新(看到更多代码后):
只需从函数返回流,WCF将决定何时处理它。
答案 2 :(得分:0)
该流需要由负责阅读它的一方关闭。例如,如果服务将流返回给客户端,则客户端应用程序负责关闭流,因为服务在客户端完成读取流时不知道或无法控制。此外,WCF不会再次关闭流,因为它不知道接收方何时完成阅读。 :)
HTH, 阿米特巴蒂亚