【发布时间】:2017-02-01 18:51:09
【问题描述】:
我需要修改一个 WCF 方法以异步运行。 [OperationContract(IsOneWay=true)] 在我的情况下不是一个有效的选项,因为客户端期望返回值。我无法控制客户端对现有 WCF 方法调用的使用,我无法更改签名以返回 void. 我也无法修改客户端以强制执行异步 WCF 调用。客户端仍然需要调用其同步 WCF 调用并获得其硬编码的响应。
在服务中,存在管理监控和异常的行为。我正在考虑的选项是让 WCF 服务自行注册或自行发现其端点,向服务添加 One-Way WCF 方法,并让同步方法通过 WCF 调用 One-Way 方法。我认为这将是确保所有现有行为仍然适用的最安全方法。这些行为不收集或依赖于来自最终客户端的任何信息。虽然从现有同步调用中启动其他线程或异步调用在技术上似乎是可行的,但我不喜欢这样,因为我认为它可能会破坏在这一点上与当前 WCF OperationContext 相关联的状态信息。
似乎我探索过的所有与此相关的选项都需要某种妥协,并且将同步调用转发到单向调用的选项将是最安全的。有没有更好的方法来解决这个问题,或者是否可以强制 WCF 方法向客户端提供与 OneWay 调用相同的立即返回,但包含返回值?
【问题讨论】:
-
如果签名返回 void,是否不能将方法体扔到 Task.Run() 中,或者使用 TPL 中的 DataFlow?
-
我担心的是异常和状态监控行为中使用了工作流信息。有一个有状态的对象存储在 OperationContext 中,用于维护有关进程的信息。例如,如果出现异常,它将所有相关的流程信息保存为一个包。我不知道 OperationContext 是否会坚持使用通过 TPL 启动的内容。
标签: c# .net wcf asynchronous