WCF,长时间运行的服务器操作和WinRT客户端

时间:2016-10-21 06:56:58

标签: c# wcf transactions windows-runtime timeout

这是我目前面临的一个问题:

  • WCF服务公开了大量方法,其中一些方法可能需要更长的时间。
  • 客户端是WinRT(Metro风格)应用程序(因此某些.NET类不可用)。
  • 客户端的超时时间已增加到1.5分钟。
  • 尽管超时时间增加,但某些操作仍需要更长时间(但并非总是如此)。
  • 如果发生超时,服务会以愉快的方式继续。请求的操作的结果将丢失。更糟糕的是,如果操作成功,那么客户端将无法获得所需的数据,服务器也不会“回滚”。

所有操作都已使用客户端上的async模式实现。我可以使用基于事件的实现,但据我所知,超时仍然会发生。

增加超时值绝对是一种选择,但它感觉就像一个非常肮脏的解决方案 - 感觉就像把问题推开而不是解决它。

在服务器上实现WS事务流似乎是不可能的 - 在设计WinRT应用程序时,我无法访问TransactionScope类。

WS Atomic看起来也有点矫枉过正(它还需要更多的设置,而且我愿意打赌WinRT应用程序的有限功能将是一个很难克服的麻烦)。

到目前为止,我唯一的想法(虽然有一个有更多移动部件,有点像重新发明轮子)是创建两个服务方法 - 一个开始一些长时间运行的操作并返回某种“任务ID” “然后在后台运行操作,并将操作结果(无论是错误还是成功)保存到具有该任务ID的DB /存储中。然后,客户端可以每隔一段时间使用该任务ID通过第二种服务方法轮询操作结果,直到这样的结果可用(无论是成功还是错误)。

这种方法也有它的缺点:

  • 长时间操作变得更长,因为客户需要轮询结果
  • 许多新的活动部件,可能会使整个事情变得不那么稳定

我还有什么办法可以解决这个问题?

PS。实际的服务方面也不是没有限制 - 它是一个MS DAX服务,它可能带有它自己的潜在陷阱和陷阱。

编辑: 看来我的问题与this SO question有一些相似之处...但是,考虑到客户端的WinRT性质和服务的MS DAX性质,我不确定答案中的任何内容对我来说真的很有用。

0 个答案:

没有答案