.net 流作为WCF中的返回值-由谁处理?

.net 流作为WCF中的返回值-由谁处理?,.net,wcf,stream,idisposable,.net,Wcf,Stream,Idisposable,假设我有以下WCF实现: public Stream Download(string path) { FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read); return stream; } 谁负责处理退回的价值?毕竟,可能会发生网络故障,因此使用者可能无法处理它。服务负责关闭流,除非您更改默认行为(始终使用具有defalut值的行为)。如果将OperationBehavior.Auto

假设我有以下WCF实现:

public Stream Download(string path)
{
    FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
    return stream;
}

谁负责处理退回的价值?毕竟,可能会发生网络故障,因此使用者可能无法处理它。

服务负责关闭流,除非您更改默认行为(始终使用具有defalut值的行为)。如果将
OperationBehavior.AutoDisposeParameters
设置为
false
,则必须注册
OperationContext.OperationCompleted
的处理程序,并按说明在处理程序中处理流


客户端无法关闭流,因为客户端具有不同的流-您没有传递对流的引用或对文件处理程序的引用。内部文件内容被复制到传输,客户端在其自己的流实例中处理它(他负责处理它)。

如果您将流包装在MessageContract中(这样您可以在头中发送更多信息),请注意流不会自动处理!正如属性OperationBehavior.AutoDisposeParameters的名称所示,WCF会自动处理输入/输出参数,因此您必须在MessageContract类上实现IDisposable并关闭其中的流。

您可以在WCF中处理返回的流,如下所示

FileStream stream=null;
OperationContext clientContext = OperationContext.Current;
clientContext.OperationCompleted += (sender, args) =>
{
    if (stream != null)
        stream.Dispose();
};

stream = new FileStream(path, FileMode.Open, FileAccess.Read);
return stream;

@Magnus,如上所述,使用者可能无法处理它,因为可能存在网络故障。@Magnus,hmmmmm,猜测很好,但我想得到一个肯定的答案:-)让使用者处理返回流与服务器端的对象引用无关,由于客户端正在获取对象的序列化版本,并且永远不会有对其在服务器上位置的对象引用。因此,您是说如果我在响应类中有一个流作为属性,响应类将需要实现IDisposable并在那里处置该流吗?换句话说,WCF将确保处理响应,我的责任是确保处理流属性的响应类代理?如果使用消息契约,则是。至少根据我2011年的测试。您肯定应该做一些测试来验证是否仍然需要它。然后避免消息契约,这通常适用于一些细粒度的控件。大多数业务应用程序都不需要消息契约。很好的解释,但如果您在响应消息契约中遇到未经处理的流,请考虑@peter sladek的答案,根据我自己的经验,我可以为其提供担保