从 WCF 返回 IObservable<T>

Posted

技术标签:

【中文标题】从 WCF 返回 IObservable<T>【英文标题】:Return IObservable<T> from WCF 【发布时间】:2013-12-06 16:23:45 【问题描述】:

我希望能够从 WCF 调用直接或从回调返回一个 IObservable。这样做的原因是,我可以收到一个我将订阅的可枚举对象,并能够一次处理一个结果。

我可以轻松地使用回调来一次只获得一个结果的推送通知,但是我不知道系列何时结束,也无法取消订阅。

我无法返回 IObservable 的明显原因似乎是因为 IObservable 不可序列化。有什么我没想到的东西可以让它工作吗?

【问题讨论】:

返回 IObservable 的具体实现。比如 MyObservableDerper 什么的。 【参考方案1】:

IObservable 将结果推送给您。您无法判断 IObservable 何时结束,只能知道它已经结束。这是他们的本性。

您没有理由序列化接口本身。

我对您期望此方法返回什么感到有些困惑 - 您提到您期望一个可枚举的(即IEnumerable?)使其成为具有单一结果的请求/响应调用。如果是这种情况,您可以使用Observable.FromAsyncPattern 轻松为结果创建一个 IObservable。

但是,如果结果将通过 Stream 或通过回调从服务器单独推送,那么您可以通过 Observable.Create 创建一个包装器,该包装器在订阅上启动连接/请求并通过 OnNext 将结果推送为他们回来,让 Dispose 关闭流等。

基本上无论哪种方式,您都在客户端创建一个代理,该代理通过本地创建的IObservable 接口公开常规 WCF 客户端。这几乎就是所有IObservable 服务的工作方式。

如果在服务器端有要返回的 IObservable,则需要在此处执行相反的操作 - 将常规客户端调用转换为订阅 IObservable,然后通过常规 WCF 流将结果发送回客户端或回调。

【讨论】:

是的。就是这样。我必须在回调中单独发回每个项目,并使用 Subject 实现一个类来接收结果并让本地客户订阅它。

以上是关于从 WCF 返回 IObservable<T>的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 IObservable<T> 转换为 IAsyncEnumerable<T>

如何从 ShowDialog 返回 IObservable<DialogResult>

IObservable<T> 和 INotifyPropertyChanged - 是不是存在连接

为啥 WCF 会返回 myObject[] 而不是 List<T> 像我期望的那样?

无效的IObservable转换,运行时异常

在 WCF 中返回或等待 Task<T>