WCF 在负载下失败 - MessageSecurityException

Posted

技术标签:

【中文标题】WCF 在负载下失败 - MessageSecurityException【英文标题】:WCF Fails Under Load - MessageSecurityException 【发布时间】:2009-01-21 23:00:00 【问题描述】:

我正在对我的网站进行负载测试。该站点使用 clientCredentialType="Windows" 调用在同一机器上运行的 WCF 服务。一切正常,直到我达到一定的负载(甚至不是很高),然后我得到以下错误:

System.ServiceModel.Security.MessageSecurityException: HTTP 请求被禁止 客户端认证方案 '匿名的'。 ----> System.Net.WebException:远程 服务器返回错误:(403) 禁止。

每次通话时,我都会创建一个频道:

var proxy = (IClientChannel)channelFactory.CreateChannel();

成功后,我关闭:

proxy.Close();

出错时,我中止:

proxy.Abort();

有什么想法吗?我可以做些什么来更好地处理负载?寻找什么?

【问题讨论】:

【参考方案1】:

您的服务是会话服务还是您不担心在调用之间保持状态?如果您没有状态,您可能希望将您的服务标记为 PerCall 服务。这将确保服务实例仅在客户端调用正在进行时才存在。

Juval Lowy 的优秀著作“Programming WCF Services”第 2 版的第 4 章涵盖了这个主题。

默认是 PerSession,这可能不是你想要的。

另外,请在 MSDN 上查看:操作方法:Control Service Instancing

【讨论】:

【参考方案2】:

谢谢特里。不,我的服务不保持状态。我尝试用以下方式装饰我的服务类:

[ServiceBehaviorAttribute(InstanceContextMode = InstanceContextMode.PerCall)]

没有帮助。故障点似乎是大约 4 个并发调用。

【讨论】:

你的 WCF 服务在做什么工作?您可以尝试的另一件事是模拟您的服务。使用相同的接口,但让实际的服务代码什么也不做。看看你有没有类似的问题。如果没有,在服务中放置一些 Thread.Sleep 来模拟正在发生的事情。 这会让我们知道您的设置方式是否有问题或您的服务有问题。明白我的意思吗?【参考方案3】:

问题是,啊,我在我的开发机器上运行测试,它是 XP,它使用 IIS 5,它有 10 个连接的限制。

【讨论】:

以上是关于WCF 在负载下失败 - MessageSecurityException的主要内容,如果未能解决你的问题,请参考以下文章

在 Kerberos 模式下,通过 WebHttpBinding 连接自托管 WCF 服务失败

如何对 Windows 服务中托管的 wcf 服务进行负载/压力测试?

WCF 未将所有内核与 Visual Studio 2010 负载测试一起使用

在负载均衡器和 SSL 后面配置 WCF

在 Azure 中托管 WCF 和可扩展性怎么样?

WCF 路由服务 - 动态错误处理