C# WCF REST服务和状态轮询

C# WCF REST服务和状态轮询,c#,rest,wcf,C#,Rest,Wcf,我目前正在开发一个REST服务,其中一个方法是一个长时间运行的任务(名为CalculatePrimeOneWay)。它的定义是 [OperationContract(IsOneWay = true)] [WebInvoke(Method = "POST", UriTemplate = "primeoneway/{jobnumber}")] void CalculatePrimeOneWay(string jobnumber, Prime prime); 由于REST服务没有回调功能,我考虑实现

我目前正在开发一个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表

我启动客户机并调用CalculatePrime单向方法。对GetJobStatus的后续调用返回WebException,其中包含协议错误、状态代码400和状态描述错误请求。 然而,如果CalculatePrimeOne完成,然后调用GetJobStatus,那么一切都可以正常工作

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


谢谢

您的行为可能是由以下两种原因之一或两种原因造成的:

  • 您正在使用每会话或单实例运行服务
  • 您正在使用与进行单向调用相同的客户端通道进行轮询调用 您应该将服务配置为每次调用实例,并在新的客户端通道实例上进行轮询调用

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

    好的,试着换一下

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    

    我在VisualStudio之外使用IIS Express

    好的-之所以出现这种行为,是因为您使用的是使用cassini web服务器的Visual Studio。这在处理请求时不支持并发。见帖子和文章


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

    “对于我的长时间运行任务和轮询机制的场景,还有哪些解决方案?”-您尝试过搜索吗?让HTTP调用持续时间超过几毫秒从来都不是一个好主意。我确实在互联网上搜索过,我发现唯一可能的想法就是这种轮询机制。由于长时间运行的方法被定义为单向,HTTP调用本身完成得非常快,我也可以在我的日志中看到这一点?或者您正在使用客户端频道?或者两者都有?我现在已经明确定义了服务PerCall。对于来自客户端的每次调用,我都会得到一个新的HttpWebRequest对象,在调用之后,我会关闭webresponse对象。行为仍然是一样的。我已经定义了如上所述的ServiceBehavior。此外,我还将服务分为两个完全独立的服务。其中一种方法是单向的。在另一个端口上,第二个服务具有轮询功能。结果仍然是一样的。轮询仅在单向方法完成其任务时有效。当我在执行单向方法期间尝试轮询时,我得到WebException,并且我的单向方法停止工作。我在VisualStudio之外使用IIS Express。@WalterTaus发生这种情况是因为您使用VS来运行它。请参见编辑我的答案。
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, 
                     ConcurrencyMode = ConcurrencyMode.Multiple,
                     UseSynchronizationContext = false)]