我有一个Dispatch MessageInspector,它反序列化SOAP消息头中包含的SAML令牌。
要进行反序列化,我使用以下代码的变体:
List<SecurityToken> tokens = new List<SecurityToken>();
tokens.Add(new X509SecurityToken(CertificateUtility.GetCertificate()));
SecurityTokenResolver outOfBandTokenResolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(new ReadOnlyCollection<SecurityToken>(tokens), true);
SecurityToken token = WSSecurityTokenSerializer.DefaultInstance.ReadToken(xr, outOfBandTokenResolver);
我看到的问题是,ReadToken调用的性能取决于运行Windows服务的帐户(托管WCF服务)。
如果服务作为Windows域帐户运行,则ReadToken调用的已用时间几乎为零。当作为本地计算机帐户运行时,调用需要200到1000毫秒。
任何人都可以了解这里发生的事情以及为什么运行这段代码的帐户会对其性能产生影响?
谢谢,
马丁
答案 0 :(得分:1)
当服务在本地帐户下运行时,会发生更多活动,例如:
访问和使用C:\ WINDOWS \ system32 \ atl.dll
尝试访问注册表项,例如 HKLM \系统\ CurrentControlSet \服务\ CertSvc \配置
在域帐户下运行时,似乎没有发生此额外活动。
在互联网上快速搜索“certcli.dll域用户”会显示微软知识库文章948080,听起来很相似。
不确定如何解决这个问题,因为最终调用.Net方法(WSSecurityTokenSerializer.ReadToken),你几乎无法控制内部。
这似乎也描述了同样的问题: