【问题标题】:WCF Service called from SharePoint workflows - Underlying connection was closed errors从 SharePoint 工作流调用的 WCF 服务 - 基础连接已关闭错误
【发布时间】:2017-09-27 16:04:09
【问题描述】:

我开发了一个从多个 SharePoint Online 工作流调用的 WCF Web 服务。在某些时候,可能有大约 4 个用户在很短的时间内启动多达 10 个工作流:一个工作流可能会向 Web 服务发出多达 3 个请求。不用说,在某些时候,WCF 服务会过载。当 SharePoint 工作流进行 HTTP Web 服务调用并且服务不可用时,工作流会遇到错误并在短时间内尝试重新启动工作流:这只会让事情变得更糟。

这些是今天在大约 40 分钟的“超载”期间从 Web 服务记录的一些异常:

无法从传输连接读取数据:现有 连接被远程主机强行关闭。

底层连接已关闭:发生意外错误 一个接收。

底层连接已关闭:预期的连接 to be keep alive 被服务器关闭了。

我试图寻找方法来避免 WCF Web 服务在发出多个请求时出现故障,以及寻找减少对 Web 服务的调用量的明显措施(这并不总是一种选择),我想到了以下术语:WCF 并发模式限制限制

鉴于上述情况,任何人都可以引导我找到最理想的并发模式和节流限制的正确方向吗?目前,我的 WCF 服务具有默认配置。

并发模式可以是:

单人多个可重入

Throttling Limit 选项如下所示:

<serviceThrottling maxConcurrentCalls="Integer"  
maxConcurrentInstances="Integer"  
maxConcurrentSessions="Integer" />  

我对这个编程领域还是很陌生,发现它有点复杂,所以非常感谢任何帮助!

更新:SharePoint 系统是高度定制的,它涵盖了一个相当复杂的业务流程。 Web Service 方法多种多样,我需要很长时间才能解释每种方法的作用,但我会提到一些示例。 Web 服务用于使用开箱即用的 SharePoint 设计器操作无法(轻松或根本)完成的操作。例如:移动文档并将元数据从一个文件夹复制到另一个文件夹(在相同或不同的列表中),在列表/库之间同步信息,根据给定文件夹中的多个文档的元数据计算值,将数据调度到外部数据库中与其他组件一起使用,例如作为计划任务运行的控制台应用程序等。

Web 服务调用平均需要 2 分钟来执行并返回一个值。最快的方法大约需要 30 秒,最慢的方法大约需要 4 分钟。经常使用慢速和快速方法。

【问题讨论】:

  • 您能否提供更多关于此 Web 服务正在执行哪些操作以及这些操作需要多长时间的信息?
  • @TiagoSousa 肯定是。我已根据您的要求更新了问题以提供更多信息。提前致谢!

标签: c# web-services wcf sharepoint concurrency


【解决方案1】:

您的问题可能是由多种原因引起的,您需要收集更多信息才能让任何人对您有所帮助。

话虽如此,我在这里能做的最好的就是给你一些关于如何收集这些信息的指示,例如:

  • Turn on WCF tracing 并尝试了解错误何时发生在 Sharepoint 端。错误是在 Web 服务处理请求时发生,之后还是从一开始就没有收到请求?
  • 如果此跟踪没有给您太多答案,write code in your webservices to Trace 特定消息可以为您提供有关 Web 服务正在做什么以及它从/返回 Sharepoint 的内容的更多信息,或者使用您首选的日志记录库。
  • 在特定情况下,EventViewer 可能有一些关于正在发生的事情的信息。检查在客户端发生错误时出现的任何消息。

最后,放松您的serviceThrottling 设置可能会缓解您的一些问题,但不会解决它们。 如果您的 Web 服务中有大量 I/O 操作(访问数据库、文件系统或其他 Web 服务),您可以通过使用异步 I/O, using the TPL framework 来提高您的 Web 服务性能。 如果您从 Web 服务返回大量数据(如大对象、具有循环引用的对象或大文件),这也可能是服务器强制关闭连接的原因。

希望这可以帮助您解决问题。

【讨论】:

  • 您好 Tiago,上述错误是否是由于 Web 服务过载导致请求长时间排队,并且 SharePoint 最终因超时而失去与 Web 服务的连接?关于您的回答,非常感谢。我尝试安装 Microsoft 工具来启用 WCF 跟踪,但是我没有管理。 “修复”建议删除 Microsoft Visual C++ Redistributable,这是我不会在实时服务器上承担的风险。
  • 事件查看器没有显示任何具体错误,但让我了解了客户端向有问题的 Web 服务发出不必要的请求。我将使用这些信息来尽量避免将来出现这种情况。关于您编写​​“跟踪代码”的建议,我将对其进行调查。希望它能为我提供有用的日志
  • 我不确定当违反 serviceThrottling 中的这些阈值时 WCF 或 IIS 是否会断开连接或返回 503 Service Unavailable 错误,但您肯定会在 Trace 上看到一些内容。如果您无法安装 Trace 查看器,请尝试重定向您的 Trace to a file of your choosing,只需更改您的配置即可。
  • 即便如此,您仍需要通过收集更多信息来缩小问题范围。在这个阶段,我认为没有人可以用你所掌握的少量信息来帮助你。
  • Trace 是 .net 写入跟踪消息的常见流。通过使用System.Diagnostics.Trace 类型,您还可以将自定义消息写入此公共流。要查看这些 .net 消息和您的消息,您需要在此流上放置侦听器,以便将这些消息写入某处(我给您的最后一个链接详细解释了这一点,包括您需要在 web.config 文件中更改的内容发生这种情况)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 2018-03-29
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多