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

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

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

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

【问题讨论】:

  • 返回 IObservable 的具体实现。比如 MyObservableDerper 什么的。

标签: c# wcf push-notification system.reactive


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 是的。就是这样。我必须在回调中单独发回每个项目,并使用 Subject 实现一个类来接收结果并让本地客户订阅它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
相关资源
最近更新 更多