【问题标题】:Implementing observer pattern using WCF使用 WCF 实现观察者模式
【发布时间】:2009-03-28 16:26:53
【问题描述】:

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

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

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

【问题讨论】:

  • 当他们只有 77 的业力时,他们如何能够提供 +100 的赏金?
  • 因为 SO 增加了 50。所以他们实际上提出了 50 个代表,而另外 50 个。
  • “改进我的网络服务”是一个非常通用的标题。如果您在问题中提到 WCF 和异步请求,您可能会获得更多帮助。
  • +1 “使用 WCF 实现观察者模式”是一个更好的标题!

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


【解决方案1】:

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

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

不难猜,双工回调就是我要找的。​​p>

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

只有支持双向的绑定才支持回调操作。 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          1. 向您的 WS API 添加分页参数(int pageNumber、int pageSize、out int totalPages)
          2. 添加将请求详细信息(可能是哈希值)与输出数据相关联的短期 TTL 缓存

          当您的应用程序请求第一页时,一旦准备好就将其返回,并将所有收集/合并的数据缓存起来,这样当需要下一页时,您可以使用已经准备好的内容。

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

          【讨论】:

          • 谢谢,我可以像我在最初的帖子中提到的那样处理这个问题,做多个请求并接收准备好的东西。我希望用 WCF 专门做这件事的方法不那么臭。我想我会在 wcf 上弄脏手,看看我能想出什么
          【解决方案6】:

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

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

          【讨论】:

          • 这也是我目前建议的方法。我不喜欢不断地用线程向 WS 询问它还有什么。寻找更好的模式。希望很快会对此进行一些研究并发布我的想法..
          猜你喜欢
          • 2011-12-21
          • 1970-01-01
          • 1970-01-01
          • 2017-01-23
          • 2013-10-28
          • 1970-01-01
          • 1970-01-01
          • 2015-02-12
          • 1970-01-01
          相关资源
          最近更新 更多