我目前正在开发一个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? 对于长期运行任务和轮询机制的场景,还有哪些其他解决方案可用?
由于
答案 0 :(得分:0)
您获得的行为可能是两件事中的一件或两件的结果:
您应该将服务配置为按次调用实例化并在新的客户端通道实例上进行轮询调用。
我现在已经明确定义了服务PerCall。对于来自的每个电话 客户端我得到一个新的HttpWebRequest对象,在通话结束后,我 关闭Web响应对象。行为仍然是相同的
确定尝试替换
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
与
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
ConcurrencyMode = ConcurrencyMode.Multiple,
UseSynchronizationContext = false)]
我在VisualStudio中使用IIS Express
好的 - 您获得此行为的原因是您使用使用cassini Web服务器的Visual Studio进行托管。处理请求时,这不支持并发。查看帖子here和here。
尝试在控制台应用中临时托管服务,此问题将得到解决。