【问题标题】:WCF REST Service and status pollingWCF REST 服务和状态轮询
【发布时间】:2016-08-04 15:37:27
【问题描述】:

我目前正在开发一个 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? 对于我的长时间运行任务和轮询机制的场景,还有哪些其他解决方案?

谢谢

【问题讨论】:

  • “对于我的长时间运行任务和轮询机制的场景,还有哪些其他解决方案可能?” - 您是否尝试过搜索?让 HTTP 调用持续时间超过几毫秒绝不是一个好主意。
  • 我确实搜索了互联网,我发现的唯一潜在想法就是这种轮询机制。由于长时间运行的方法被定义为 OneWay,HTTP 调用本身完成得非常快,我也可以在我的日志中看到这一点。
  • 您使用的是按会话/单例实例化吗?或者您是否在重新使用客户渠道?还是两者兼而有之?

标签: c# rest wcf


【解决方案1】:

您的行为可能是以下两种情况之一或两者的结果:

  1. 您正在使用按会话或单例实例运行服务
  2. 您正在重复使用相同的客户端通道来进行轮询调用,就像进行单向调用一样。

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

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

好的尝试替换

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

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

我在 VisualStudio 之外使用 IIS Express

好的 - 您出现此行为的原因是因为您使用的是使用 cassini Web 服务器的 Visual Studio 进行托管。这在处理请求时不支持并发。请参阅帖子 herehere

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

【讨论】:

  • 我现在已经明确定义了 PerCall 服务。对于来自客户端的每次调用,我都会得到一个新的 HttpWebRequest 对象,并在调用后关闭 webresponse 对象。行为仍然相同。
  • 如上所述,我已经定义了 ServiceBehavior。此外,我已将服务拆分为两个完全独立的服务。其中一个有 OneWay 方法。在另一个端口上,第二个服务具有轮询功能。结果还是一样。轮询仅在 OneWay 方法完成其任务时才起作用。当我在执行 OneWay 方法期间尝试轮询时,我得到 WebException 并且我的 OneWay 方法也停止工作。我在 VisualStudio 中使用 IIS Express。
  • @WalterTaus 发生这种情况是因为您正在使用 VS 来运行它。请参阅对我的答案的编辑。
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2012-11-08
  • 2018-08-05
  • 2020-11-16
相关资源
最近更新 更多