WCF REST服务和状态轮询

本文关键字:状态 REST 服务 WCF | 更新日期: 2023-09-27 18:00:16

我目前正在开发一个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的调用返回一个WebException,其中包含协议错误、状态代码400和状态描述错误请求。然而,如果CalculatePrimeOneWay完成,然后我调用GetJobStatus,一切都会很好。

为什么CalculatePrimeOneWay仍在运行时我无法调用GetJobStatus?对于我的长时间运行任务和轮询机制的场景,还有什么其他可能的解决方案?

感谢

WCF REST服务和状态轮询

您得到的行为可能是两件事中的一件或两件的结果:

  1. 您正在使用每个会话或单例实例化运行服务
  2. 您正在使用与进行单向调用相同的客户端通道进行轮询调用

您应该将服务配置为每次调用实例化,并在新的客户端通道实例上进行轮询调用。

我现在已经明确定义了PerCall服务。对于来自的每个呼叫客户端我得到一个新的HttpWebRequest对象,在调用之后关闭web响应对象。行为仍然是相同的

OK尝试更换

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

带有

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, 
                 ConcurrencyMode = ConcurrencyMode.Multiple,
                 UseSynchronizationContext = false)]

我在VisualStudio中使用IIS Express

好吧,你出现这种行为的原因是因为你使用的是使用cassini web服务器的Visual Studio。这在处理请求时不支持并发性。查看此处和此处的帖子。

尝试在控制台应用程序中临时托管该服务,此问题将得到解决。