WCF Windows服务 - 长时间操作/回调到调用模块

A9S*_*9S6 10 .net c# wcf windows-services callback

我有一个Windows服务,它取一堆文件的名称并对它们进行操作(zip/unzip,更新db等).根据发送到服务的文件的大小和数量,操作可能需要一些时间.

(1)向该服务发送请求的模块将等待处理文件.我想知道是否有一种方法可以在服务中提供一个回调,它将在完成处理文件时通知调用模块.请注意,多个模块可以一次调用服务来处理文件,因此服务需要提供某种TaskId我猜.

(2)如果调用了一个服务方法并且正在运行另一个对同一服务的调用,那么该调用将如何处理(我认为只有一个与该服务相关联的线程).我已经看到,当服务在处理方法时花费时间时,与服务相关联的线程开始增加.

mar*_*c_s 14

WCF确实提供了双工绑定,允许您指定回调契约,以便服务可以回调给调用客户端进行通知.

但是,在我看来,这种机制相当薄弱,并不值得推荐.

在这种情况下,当调用导致相当长的运行操作发生时,我会做这样的事情:

如果你想坚持使用HTTP/NetTcp绑定,我会:

  • 通过服务放弃请求,然后"放手" - 这将是一个单向呼叫,你只是放弃你想要做的事情,然后你的客户端完成
  • 有一个状态调用,客户端可以在给定时间后调用,以查明请求的结果是否已准备就绪
  • 如果是,则应该进行第三次服务调用以检索结果

因此,在您的情况下,您可以删除压缩某些文件的请求.该服务将启动并完成其工作并将生成的ZIP存储在临时位置.然后,客户端可以检查ZIP是否准备就绪,如果是,则检索它.

这在每个Windows服务器计算机中都存在的消息队列(MSMQ)上工作得更好(但很多人似乎并不知道或使用它):

  • 您的客户端在请求队列上删除请求
  • 服务侦听该请求队列并在请求后提取请求并且它是否有效
  • 然后,服务可以将结果发布到结果队列,您的呼叫者依次在该队列中监听

通过阅读优秀的MSDN文章Foudnations:构建队列WCF响应服务,了解如何有效地完成所有这些- 强烈推荐!

在我看来,基于消息队列的系统往往比基于双工/回调合约的系统更稳定,更不容易出错.