【问题标题】:Long time running WCF 504 GATEWAY_TIMEOUT error长时间运行 WCF 504 GATEWAY_TIMEOUT 错误
【发布时间】:2016-03-23 23:14:48
【问题描述】:

我正在 webHttpBinding 上开发 WCF Web 服务,客户端应用程序按需调用此 WCF Web 服务 (HTTP POST) 或通过调度程序 Windows 服务(当前使用 Quartz.net)。

每次调用都会运行一个可能需要 10-30 分钟的任务列表。 1 分钟后我收到 504 Gateway_Timeout 错误。我已尝试增加 WCF Web 服务的限制,但仍然出现错误。

<webHttpBinding>
    <binding name="webHttpBindingWithJsonP"  closeTimeout="00:30:00" openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00" maxReceivedMessageSize="50000000" maxBufferSize="50000000" maxBufferPoolSize="50000000" crossDomainScriptAccessEnabled="true"/>
  </webHttpBinding>


 <httpRuntime executionTimeout="1800" targetFramework="4.0"/>

无论错误如何,任务都会完成。我不确定 Web 请求超时时 WCF 是否仍在运行?如果一个任务需要更少的时间,例如半分钟,那么它会返回有效的结果。

我已尝试使用所有 switchvalue 跟踪日志并使用 traceviewer 监视输出,没有发现错误。

我的问题是应该将 WCF 服务设计为 webHttpBinding 服务,还是应该将其设计为不同的类型?

【问题讨论】:

  • 为什么不将其设置为来自客户端的单向调用,然后让客户端定期查询服务以获取状态。
  • @Tim,是的,在客户端应用程序中,我使用 Task.Run() 来实现 fire & forget API 调用,就在我在 Chrome 的 Postman 中测试 WCF 时,它给出了 504 错误。我想确保 WCF 中的进程在返回 504 后仍在运行。

标签: c# wcf quartz-scheduler webhttpbinding http-status-code-504


【解决方案1】:

您是否考虑过在初次通话时提供状态页面,然后让用户(反复)检查状态页面以验证任务是否完成?

这将确保没有任何超时,因为连接将是短暂的。

【讨论】:

  • 在客户端应用程序中,我使用 Task.Run() 来实现 fire & forget API 调用,将作业状态记录为正在运行,并让 ajax 每 x 秒检查一次完成情况,就在我测试Chrome 邮递员中的 WCF,它给出了 504 错误。我想确保 WCF 中的进程在 504 返回客户端后仍在运行
  • 您需要公开一种方法来检查不同的端点是否完成。保持 WCF 连接保持打开状态会导致此类错误。如果您以某种方式进行通信,则可以使其正常工作,但是仅等待数十分钟将很困难,因为在没有数据传输的情况下打开连接需要很长时间。
  • 这正是我正在做的有不同的 wcf 检查状态,我担心的是第一个任务实现 wcf 不能保持连接太久,我怎样才能确保它始终运行并完成?我不介意单向调用并忘记结果,稍后检查状态 wcf。
猜你喜欢
  • 2016-11-17
  • 2018-12-31
  • 2012-03-23
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多