WebHttpBinding和Callbacks

时间:2011-06-07 17:41:15

标签: wcf

我有asp.net网站,我使用jQuery调用我的WCF服务。 有时,WCF服务必须能够向用户询问确认信息并依赖用户选择继续或取消工作

回调能帮助我吗? 或任何其他想法赞赏!

2 个答案:

答案 0 :(得分:2)

回调契约在这种情况下不起作用,因为它们主要用于双工通信,并且WebHttpBinding上没有双工(Silverlight中有一个轮询双工场景的解决方案,我在javascript中看到过一个实现使用它,但这对你的场景来说可能太复杂了。)

您可以做的是将操作分成两部分。第一个将“启动”操作并返回一个标识符和一些附加信息,以告诉客户端操作是否刚刚完成,或者是否需要其他信息。在前一种情况下,客户端可以调用第二个操作,传递标识符以获得结果。在第二个中,客户端将再次进行呼叫,但是传递操作所需的附加信息以完成(或被取消)。

答案 1 :(得分:2)

您的架构错了。原因:

  • 服务无法回调客户端的浏览器。 HTTP上的真正回调就像反向通信一样 - 客户端是托管客户端调用的服务。您的案例中的客户端是浏览器 - 您希望如何在浏览器中托管服务?您想如何从浏览器打开传入通信的端口?使用“回调式”功能的解决方案基于池化服务。您可以使用JavaScript计时器并实现自己的池化机制。
  • 客户端浏览器无法启动分布式事务,因此无法在客户端上启动事务。您不能在多个操作上使用服务器端事务,因为它需要每会话实例化,而这又需要sessinoful通道。
  • WCF JSON / REST服务不支持HTTP回调(双工通信)。
  • WCF JSON / REST服务不会为您构建池化解决方案 - 您必须自己动手
  • WCF JSON / REST服务不支持分布式事务
  • WCF JSON / REST服务不支持会话通道/服务器端会话

这是您的解决方案的技术方面。

您的解决方案看起来更像是启动工作流的Workflow服务的场景,并且它会一直运行到等待用户输入的某个点。在提供输入之前,工作流可以持久保存到数据库,因此通常用户可以在几天后提供输入。当提供输入时,服务可以继续。启动服务并提供每个所需的输入被建模为从客户端调用的单独操作。对于从JavaScript调用的内容,这不是常见的情况,但应该可以,因为您可以编写自定义WebHttpContextBinding来支持工作流。它仍然无法实现用户将被自动询问的情况 - 您有责任找到弹出窗口何时出现并处理它。

如果您离开标准WCF世界,您可以检查COMET等提供AJAX推送/回调的解决方案。