2016-08-04 86 views
2

我目前正在开发一个REST服务,其中一种方法是长时间运行的任务(名为CalculatePrimeOneWay)。它的定义是WCF 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表。

我启动我的客户端并调用CalculatePrimeOneWay方法。随后对GetJobStatus的调用返回带有协议错误,状态码400和状态描述错误请求的WebException。 但是,如果CalculatePrimeOneWay完成,然后我调用GetJobStatus,所有工作都很好。

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

感谢

+1

_“我的长时间运行任务和轮询机制的场景有什么其他解决方案?” - 您是否尝试搜索?让一个HTTP调用的持续时间超过几毫秒从来都不是一个好主意。 – CodeCaster

+1

我没有搜索互联网,我发现的唯一可能的想法是这种轮询机制。由于长时间运行的方法被定义为OneWay,所以HTTP调用本身完成得非常快,我也可以在我的日志中看到。 –

+0

你在使用per-session/singleton实例吗?或者您是否重新使用客户频道?或两者? –

回答

0

你得到可能是一个或两个的两件事情的结果的行为:

  1. 您与运行服务每个会话或者单实例存储
  2. 你是重复使用相同的客户端通道进行轮询呼叫,就像您进行单向呼叫一样。

您应该将该服务配置为按呼叫实例化并在新客户端通道实例上进行轮询呼叫。

我现在已经明确定义了服务PerCall。对于每个来自 的调用,客户端都会获得一个新的HttpWebRequest对象,并且在调用之后,我将关闭Web响应对象 。该行为仍然是相同的

OK尝试更换

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 

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

我使用IIS表达出我的VisualStudio

确定的 - 的原因你得到这种行为我因为您使用的是使用cassini Web服务器的Visual Studio。这在处理请求时不支持并发。查看帖子herehere

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

+0

我现在明确定义了服务PerCall。对于来自客户端的每次调用,我都会得到一个新的HttpWebRequest对象,并在调用之后关闭Web响应对象。行为仍然是一样的。 –

+0

@WalterTaus我刚更新了我的文章。 –

+0

我已经如上所述定义了ServiceBehavior。此外,我将服务分成两个完全独立的服务。 OneWay方法在其中。在另一个端口上,第二个服务具有轮询功能。结果仍然是一样的。只有在OneWay方法完成其任务时才进行轮询。当我在OneWay方法的执行过程中尝试进行轮询时,出现WebException并且我的OneWay方法停止工作。我从VisualStudio中使用IIS Express。 –