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 服务进行负载/压力测试?