作为WCF中的返回值进行流处理-由谁来处理它



假设我有以下WCF实现:

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

谁负责处理返还的价值?毕竟,可能会发生网络故障,因此消费者可能无法处理它。

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

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

如果您将Stream包装在MessageContract中(这样您就可以在标头中发送更多信息),请注意Stream不会自动处理!作为属性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;

相关内容

  • 没有找到相关文章

最新更新