Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF线程被中止错误_Wcf_Iis - Fatal编程技术网

WCF线程被中止错误

WCF线程被中止错误,wcf,iis,Wcf,Iis,我有一个WCF服务,在IIS7中运行良好,但是一旦部署到WindowsServer2003,IIS6,我现在收到“线程被中止”错误消息。这在服务运行几分钟后发生 我已尝试手动更改一些超时值并关闭IIS保持有效 任何关于如何解决这个问题的想法都将受到欢迎 如果您遇到此问题,请阅读!希望你能省去很多麻烦。先喝咖啡 您可能来自与SOA无关的领域的传统编程背景,现在您正以“传统程序员”的心态编写SOA服务。以下是自构建SOA服务以来我学到的4个最重要的教训 规则编号1 尽量不要编写需要较长时间才能完成的

我有一个WCF服务,在IIS7中运行良好,但是一旦部署到WindowsServer2003,IIS6,我现在收到“线程被中止”错误消息。这在服务运行几分钟后发生

我已尝试手动更改一些超时值并关闭IIS保持有效

任何关于如何解决这个问题的想法都将受到欢迎


如果您遇到此问题,请阅读!希望你能省去很多麻烦。先喝咖啡

您可能来自与SOA无关的领域的传统编程背景,现在您正以“传统程序员”的心态编写SOA服务。以下是自构建SOA服务以来我学到的4个最重要的教训

规则编号1

尽量不要编写需要较长时间才能完成的服务。我知道这可能很难实现,但是多次调用较小的操作要比一个长服务执行所有工作,然后返回响应可靠得多。例如,最近我编写了一个处理所有任务的服务。每个任务都以XML文件的形式存储在IIS站点中,每个任务都会将数据导出到一个系统,例如SharePoint。在高容量期间的任何给定时间,可能有多达30000个任务等待处理。在过去的两个月里,我还没有获得100%的可靠性,这是在深入研究IIS、应用程序池和WCF绑定中的超时设置之后。我时不时地会听到“线程被中止了”,没有任何原因或解释为什么会发生这种情况。我用尽了所有的在线知识库,似乎没有人比我更聪明。最终,在无法修复问题,甚至无法以可靠的方式重现问题后,我选择了完全重写。我将代码改为一次只处理一个任务,而不是处理所有任务

这本质上意味着调用1个web服务30000次,而不是一次调用,但从性能角度看,调用次数大致相同。每次呼叫都会快速做出响应,而且所做的工作要少得多。这还有另一个好处,我可以为客户提供每次操作的即时反馈。在长时间通话中,您会在通话结束时立即得到回复

如果服务调用失败,您还可以更轻松地捕获并重试服务调用,因为您不必再次为每个操作重做整个调用,只需重做失败的操作即可

它也更容易测试,这不仅是因为实时反馈,还因为您可以测试1个内部操作,如果您愿意的话,不需要循环的开销

最后,如果您计划以后扩展应用程序,它会增加更好的可伸缩性,因为您将事情分解为更易于管理的工作单元。例如:在您有一个处理所有任务的服务之前,现在您有一个可以处理一个任务的web服务,因此,如果您需要处理10个任务或通过选择来处理任务,您可以更轻松地扩展功能

规则编号2 不要仅仅因为认为它是一种更好的技术就将现有的ASMX web服务升级到WCF 3。WCF3的体系结构过于复杂,使用或部署起来不是一种真正的乐趣。如果您需要使用WCF,请尽量坚持使用框架的.NET4附带的版本,该版本似乎已经过修改。您将错过的另一件事是WCF没有测试表单,所以您不能快速启动web浏览器来测试您的服务。如果你像我一样——“保持简单愚蠢”,那么WCF3.5会让你失望

规则编号3 IIS6可能是不可靠的,如果您想要可靠的服务,那么尽可能避免在IIS6中托管您的服务。我并不是说IIS6不可能实现可靠性,但它需要大量的工作和大量的测试。如果你处理的是至关重要的服务,尽量避免使用2001年开发的产品

规则编号4
不要低估创建可靠SOA服务所需的开发和测试。老实说,我只能说这是一项巨大的事业

我想我应该提到这个错误是SharePoint在从用户帐户调用某些函数时抛出的。这些函数需要使用
SPSecurity.RunWithElevatedPrivileges运行


搜索“wcf sharepoint线程被中止”时会显示此答案,因此希望这对某些人有用,因为当sharepoint出现权限问题时,抛出“线程被中止”不是很有用。

我意识到这与超时值无关,但肯定有一些我正在试图追踪的令人不快的代码,一旦我确定了确切的原因,我会发布我的答案。你不会碰巧发现发生了什么,是吗?我认为我们在这里遇到了同样的问题。@Kevin,我建议切换回asmx,或升级到Framework4.0(因为我听说WCF有一些改进,但没有这方面的个人经验)。我的解决方案是降级到asmx,这会抛出更容易调试和解决的真正错误。我也遇到过同样的情况,但我在互联网上找到了解决方案。我在try-catch块中使用了response.redirect。一旦我取出并放在试扣外面,它就开始工作了。