gpt4 book ai didi

c# - WCF REST 服务和状态轮询

转载 作者:太空宇宙 更新时间:2023-11-03 15:16:50 25 4
gpt4 key购买 nike

我目前正在开发一个 REST 服务,其中一个方法是一个长时间运行的任务(名为 CalculatePrimeOneWay)。它的定义是

[OperationContract(IsOneWay = true)]
[WebInvoke(Method = "POST", UriTemplate = "primeoneway/{jobnumber}")]
void CalculatePrimeOneWay(string jobnumber, Prime prime);

由于REST Service没有回调能力,我想实现一种轮询的方式来获取状态信息。这种轮询方法定义为

    [OperationContract]
[WebGet(UriTemplate = "poll/{jobnumber}")]
Job GetJobStatus(string jobnumber);

我将状态信息写入 MS SQL 表。

我启动我的客户端并调用 CalculatePrimeOneWay 方法。对 GetJobStatus 的后续调用返回带有协议(protocol)错误、状态代码 400 和状态描述错误请求的 WebException。但是,如果 CalculatePrimeOneWay 已完成,然后我调用 GetJobStatus,则一切正常。

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

谢谢

最佳答案

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

  1. 您正在使用每 session 或单例实例运行该服务
  2. 您正在重新使用与进行单向调用时相同的客户端 channel 来进行轮询调用。

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

I have now explicitly defined the service PerCall. For each call from the client I get a new HttpWebRequest object and after the call, I close the web response object. The behaviour is still the same

确定尝试更换

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

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

I am using IIS Express out of my VisualStudio

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

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

关于c# - WCF REST 服务和状态轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38771763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com