【问题标题】:execution terminated in middle when the API is Called concurrently using HttpClient使用 HttpClient 并发调用 API 时执行中途终止
【发布时间】:2018-01-05 07:41:57
【问题描述】:

我在使用 HttpClient 从托管在同一服务器上的另一个 Web 服务调用 Web 服务时遇到问题。

场景是,有一个 REST webService,让我们说“WebService1”,它接收来自多个客户端的请求以创建 PDF。 WebService1 进一步调用另一个 Web 服务“BackendWebService”来创建 PDF 文档。此后端 WebService 引用第三方库来创建 PDF。

现在发生的情况是,如果单个用户使用 10 个请求调用 WebService1,则没有问题。所有请求均已成功处理。 但是如果有多个用户参与,同时向WebService1发送请求,那么只有少数记录被处理成功,一些记录被 终止于中间。似乎代码没有完全执行,应用程序没有完成整个过程就被终止了。

为什么会这样?请帮忙。我已经只创建了一个 HttpClient 的静态实例,但仍然没有 Luck。

WebService1 调用 BackendWebService 如下:

对于来自客户端的每个 PDF 请求数:

This is how WebService calls the BackendWebService

【问题讨论】:

  • 需要更多信息,一定是抛出了一个没有被正确记录的异常
  • 另外值得一提的是BaseAdressDefaultRequestHeaders 可能不是线程安全的。
  • @Eric Walter,奇怪的是,我一直在监视 IIS 日志、事件查看器等,但不幸的是没有记录任何错误。此外,当异常被捕获和记录时,还有 try catch 块。但是日志在那里!
  • 很可能陷入僵局。永远不要将 .Result 与 HttpClient 一起使用 - 使用 async/await
  • @Todd Menier,我也尝试过实现 async/await,但它也不适用于多个并发调用。仅适用于单个实例。如果单个调用处理了 10 条记录,那么它可以工作,但是这些记录分布在 5 个实例中(每个实例 2 个)并同时调用,那么它会失败,只处理 6/7 条记录。

标签: c# multithreading web-services concurrency dotnet-httpclient


【解决方案1】:

我终于知道了这个问题的原因。

在多个进程将登录信息写入 txt 文件时,BackendWebService 中引用的库(名为 processhandler.dll 的自定义库)存在并发问题。当此引用库中出现异常时,进程将终止,而 IIS 或应用程序级日志中也没有任何信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多