0

我有一个 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 毫秒。

谁能解释这里发生了什么以及为什么运行这段代码的帐户对其性能有影响?

谢谢,

马丁

4

1 回答 1

1

当服务在本地帐户下运行时,会发生更多活动,例如:

  • 访问和使用 C:\WINDOWS\system32\certcli.dll
  • 访问和使用 C:\WINDOWS\system32\atl.dll

  • 尝试访问注册表项,例如 HKLM\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration

在域帐户下运行时,似乎不会发生这些额外活动。

在 Internet 上快速搜索“certcli.dll 域用户”会出现 microsoft 知识库文章 948080,这听起来很相似。

不确定如何解决这个问题,因为最终调用了一个 .Net 方法(WSSecurityTokenSerializer.ReadToken),您几乎无法控制内部结构。

这似乎也描述了同样的问题:

http://groups.google.com/group/microsoft.public.biztalk.general/browse_thread/thread/402a159810661bf6?pli=1

于 2010-09-24T14:25:45.153 回答