【发布时间】:2016-08-04 15:37:27
【问题描述】:
我目前正在开发一个 REST 服务,其中一种方法是一项长时间运行的任务(名为 CalculatePrimeOneWay)。它的定义是
[OperationContract(IsOneWay = true)]
[WebInvoke(Method = "POST", UriTemplate = "primeoneway/{jobnumber}")]
void CalculatePrimeOneWay(string jobnumber, Prime prime);
由于 REST 服务没有回调能力,所以我考虑实现一种轮询方法来获取状态信息。这种轮询方式定义为
[OperationContract]
[WebGet(UriTemplate = "poll/{jobnumber}")]
Job GetJobStatus(string jobnumber);
我将状态信息写入 MS SQL 表。
我启动客户端并调用CalculatePrimeOneWay 方法。对 GetJobStatus 的后续调用返回带有协议错误、状态代码 400 和状态描述错误请求的 WebException。 但是,如果CalculatePrimeOneWay 完成,然后我调用GetJobStatus,那么一切正常。
为什么在 CalculatePrimeOneWay 仍在运行时无法调用 GetJobStatus? 对于我的长时间运行任务和轮询机制的场景,还有哪些其他解决方案?
谢谢
【问题讨论】:
-
“对于我的长时间运行任务和轮询机制的场景,还有哪些其他解决方案可能?” - 您是否尝试过搜索?让 HTTP 调用持续时间超过几毫秒绝不是一个好主意。
-
我确实搜索了互联网,我发现的唯一潜在想法就是这种轮询机制。由于长时间运行的方法被定义为 OneWay,HTTP 调用本身完成得非常快,我也可以在我的日志中看到这一点。
-
您使用的是按会话/单例实例化吗?或者您是否在重新使用客户渠道?还是两者兼而有之?