WCF线程被中止错误

时间:2010-03-05 10:43:51

标签: wcf iis

我有一个在IIS 7中运行良好的WCF服务,但是一旦部署到Windows Server 2003,IIS6,我现在得到 - “线程被中止”错误消息。这是在服务运行几分钟后发生的。

我已尝试手动更改某些超时值并关闭IIS保持活动状态。

有关如何解决此问题的任何想法都会受到欢迎。

由于

2 个答案:

答案 0 :(得分:1)

如果您遇到此问题 - 请阅读!希望你能省下自己很多麻烦知道这一点。先喝咖啡吧!

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

规则1

尽量不要编写需要花费更长时间才能完成的服务。我知道这可能非常棘手,但是让小型操作被多次调用,比执行所有工作的长服务,然后返回响应更可靠。例如,最近我编写了一个处理所有任务的服务。每个任务都作为XML文件存储在IIS站点中,每个任务都会将数据导出到系统,例如:SharePoint。在高容量的任何给定时间,可能有多达30 000个任务等待处理。在过去的2个月里,我还没有100%可靠,这是在深入IIS,AppPools和WCF绑定的超时设置之后。每次我都会得到 - “线程被中止”,没有理由或解释为什么会发生这种情况。我耗尽了所有在线知识库,似乎没有人更聪明。最终,在无法解决问题甚至以可靠的方式重现问题之后,我选择了完全重写。我更改了代码而不是处理所有任务,一次只处理1个任务。

这实际上意味着调用1个Web服务30 000次,而不是调用一次,但性能方面,它大致相同。每次通话都会快速发出响应,并且可以减少工作量。这有另一个好处,我可以为客户提供每个操作的即时反馈。在长期通话中,您会在最后收到回复,并立即收到所有回复。

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

它也更容易测试,不仅因为实时反馈,还因为你可以测试1个内部操作,如果你愿意,可以没有循环开销。

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

规则2 不要仅仅因为您认为它是更好的技术而将现有的ASMX Web服务升级到WCF 3。 WCF 3已经过度架构,并不适合使用或部署。如果你需要去WCF,尽量支持框架的.net 4附带的版本,它似乎已经被修改了。您将遗漏的另一件事是WCF没有测试表单,因此您不能快速启动Web浏览器来测试您的服务。如果你像我一样 - “保持简单愚蠢”然后WCF 3.5会让你感到沮丧。

规则3 IIS6可能是狡猾的,如果您可以避免必须在IIS6中托管您的服务,如果您正在寻求可靠的服务。我并不是说它不可能在IIS6中实现可靠性,但它需要大量的工作和大量的测试。如果您正在处理关键服务,请尝试避免使用2001年开发的产品。

规则4 不要低估创建可靠SOA服务所需的开发和测试。说实话,我可以说这是一项艰巨的任务。

答案 1 :(得分:0)

我想我会提到SharePoint从用户帐户调用某些函数时会抛出此错误。这些功能需要使用SPSecurity.RunWithElevatedPrivileges

运行

当搜索“wcf sharepoint Thread正在中止”时,会出现这个答案,所以希望这对某人有用,因为“线程被中止”对于SharePoint在权限问题时抛出并不是非常有用。