使用WCF实现观察者模式

当我第一次发布这个问题时,我的Web服务和应用程序控制器之间有很强的耦合,控制器需要打开多个线程到服务,并且当它接收到数据时,它必须对返回的数据进行大量处理并将其合并到一个数据集。 我不喜欢客户端在准备好使用它之前必须处理和合并返回的数据这一事实,并希望将该层移动到服务并让服务打开供应商的异步线程并合并结果在将它们返回给客户之前。

我遇到的一个挑战是,我不能等到所有线程完成并且结果合并,我必须开始接收数据,因为它可用。 这叫我在服务上实现一个观察者模式,以便在合并新的结果集并准备好使用它并将它们发送到应用程序时通知我的应用程序。

我正在寻找如何使用ASMX webservices或WCF执行此操作,到目前为止,我已经发现使用WCF实现它,但此线程始终是开放的建议和改进。

好的,我的问题的解决方案来自WCF

除了ASMX Web服务的经典请求 – 回复操作之外,WCF还支持其他操作类型,例如: 单向呼叫,双工回叫和流媒体。

不难猜测,双工回拨是我想要的。

双工回调只允许服务对客户端进行回叫。 在服务器上定义了回调契约,并且客户端需要在每次调用时提供回调端点。 然后由服务决定何时以及使用回调引用的次数。

只有支持bidirectiona的绑定才支持回调操作。 WCF提供WSDualHttpBinding以支持HTTP上的回调(NetNamedPipeBinding和NetTcpBinding也存在回调支持,因为TCP和IPC协议支持双工通信)

这里需要注意的一件非常重要的事情是双工回调是非标准的纯Microsoftfunction。 这不会对我当前的任务造成问题,因为我的Web服务和应用程序都在Microsoft ASP.NET上运行

编程WCF服务给了我一个很好的WCF启动。 它超过700页,深入研究了所有WCF的概念,并有一个关于回调和其他类型操作的专门章节。

我在网上找到的其他一些好资源是;

Windows Communication Foundation(WCF)截屏video

MSDN网络广播:Windows Communication Foundation从上到下

网络服务软件工厂

WCF服务工厂

这听起来像是Windows Workflow Foundation的完美用例。 您可以轻松创建工作流以从每个供应商处获取信息,然后在准备好时合并结果。 它更干净,WF会为你做所有异步的东西。

我不太确定这里需要双工… IMO,带回调的标准异步调用应该足以获得数据传递通知。

最大的问题是什么? 如果你在谈论async等,那么我们通常会讨论将数据传送到客户端所花费的时间。 这是由于纯粹的数据量? 或者在服务器上生成数据的复杂性?

如果是数据量,那么我可以想出一些显着提高性能的方法 – 尽管大多数方法都涉及使用DTO对象(而不是DataSet / DataTable ,这似乎暗示在问题中)。 例如, protobuf-net显着减少了传输数据所需的数据量和处理。

实现此目的的方法之一是异步调用WS( http://www.stardeveloper.com/articles/display.html?article=2001121901&page=1,http://www.ondotnet.com/pub/a/ dotnet / 2005/08/01 / async_webservices.html ),然后在回调中更新GUI。

但是,如果查询数据的时间过长,则可能会出现超时问题。 例如,如果供应商的某个网站停机或非常慢,这可能意味着整个查询可能会失败。 也许如果您在客户端的业务逻辑进行合并而不是WS执行它会更好。

不确定此解决方案是否适合您的特定任务,但无论如何:

  1. 将分页参数添加到WS API(int pageNumber,int pageSize,out int totalPages)
  2. 添加一个短生命TTL缓存,将请求详细信息(可能是哈希值)与输出数据相关联

当您的应用程序要求第一页时,请在它准备好后立即将其返回并将整堆收集/合并的数据放入缓存中,这样当需要下一页时,您可以使用已准备好的内容。

但请注意,您不会获得最新的数据,请谨慎配置缓存重新加载间隔。

在您的场景和技术中存档的绝对最佳方式是在您的Web应用程序/库与您的Web服务之间存在某种令牌,并且您的控制器需要有一个线程来检查是否有新的结果等。但请注意您将需要从WS获取完整的数据,因为它的合并可能导致从初始响应中删除项目。

或者我仍然认为使用WCF Web服务从控制器处理线程会更好