C# WCF REST服务和状态轮询
我目前正在开发一个REST服务,其中一个方法是一个长时间运行的任务(名为CalculatePrimeOneWay)。它的定义是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服务没有回调功能,我考虑实现
[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?
对于我的长时间运行任务和轮询机制的场景,还有什么其他解决方案
谢谢您的行为可能是由以下两种原因之一或两种原因造成的:
[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)]