使用WCF实现观察者模式

时间:2009-03-28 16:26:53

标签: c# .net asp.net wcf web-services

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

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

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

6 个答案:

答案 0 :(得分:5)

确定问题的解决方案来自WCF

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

不难猜测,我正在寻找双工回调。

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

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

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

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

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

Windows Communication Foundation (WCF) Screencasts

MSDN Webcast: Windows Communication Foundation Top to Bottom

Web Service Software Factory

The Service Factory for WCF

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

  1. 向您的WS API添加分页参数(int pageNumber,int pageSize,out int totalPages)
  2. 添加一个短生命TTL缓存,将请求详细信息(可能是哈希值)与输出数据相关联
  3. 当你的应用程序要求第一页时,请在它准备好后立即将其返回并将整堆收集/合并的数据放入缓存中,这样当需要下一页时,你可以使用已准备好的页面。

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

答案 5 :(得分:0)

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

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