gpt4 book ai didi

c# - 在 System.DirectoryServices.AccountManagement 中调用 UserPrinciapl.GetGroups 时出现奇怪的间歇性错误处理错误

转载 作者:太空狗 更新时间:2023-10-29 21:46:30 26 4
gpt4 key购买 nike

背景

我们有一个用 C# 编写的 asp.net 4.0 Web 应用程序调用用 C# 编写的 .net 3.5 Web 服务。 Web 服务被传递一个用户 ID 并根据用户所属的事件目录组返回一个数据列表。

Web 服务使用 .net 3.5 版本的 System.DirectoryServices.AccountManagement 获取用户所属组的 Sid。

对 UserPrincipal.GetGroups 的调用间歇性失败并出现以下错误。发生之间有很长的时间段,但当它确实发生时,它会重复发生几分钟。不同的 AD 用户会出现此问题。

此异常的堆栈跟踪对我们来说毫无意义。我们花了很多时间查看 Reflector/ILSpy 中的 Microsoft AD 代码,但无法超越对 IADsPathName.Retrieve 的调用。

异常

System.NotSupportedException: Specified method is not supported.
at System.Web.HttpResponseStream.get_Position()
at System.Drawing.UnsafeNativeMethods.ComStreamFromDataStream.Seek(Int64 offset, Int32 origin)
at System.DirectoryServices.AccountManagement.UnsafeNativeMethods.IADsPathname.Retrieve(Int32 lnFormatType)
at System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDomainInfo()
at System.DirectoryServices.AccountManagement.ADStoreCtx.get_DnsForestName()
at System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOf(Principal p)
at System.DirectoryServices.AccountManagement.Principal.GetGroupsHelper()
at System.DirectoryServices.AccountManagement.Principal.GetGroups()
at Data.SoftwarePublishingItemData.GetSids(String requestedForUserId)
at Data.SoftwarePublishingItemData.GetSoftwarePublishingItems(IDatabaseContext dbContext, GetSoftwarePublishingItemsSettings settings, XBXmlDocument parameters)
at Web.GetSoftwarePublishingItems.GetFlexiFieldData(String xml)

重现代码

请注意,CauseNotSupportedException 方法模仿的代码不在我们的应用程序中运行,而是在我们无法控制的环境中其他地方的代码中运行。/p>

class Program
{
static void Main(string[] args)
{
CauseNotSupportedException();

string samAccountName = "domain.user";

using (var principalContext = new PrincipalContext(ContextType.Domain))
{
using (var userPrincipal = UserPrincipal.FindByIdentity(principalContext, IdentityType.SamAccountName, samAccountName))
{
if (userPrincipal == null)
throw new ActiveDirectoryObjectNotFoundException();

using (var groups = userPrincipal.GetGroups())
{
foreach (GroupPrincipal group in groups)
{
Console.WriteLine(group.Sid);
}
}
}
}
}

public static void CauseNotSupportedException()
{
using (var b = new Bitmap(500, 500, PixelFormat.Format32bppArgb))
{
b.Save(new FakeStream(), ImageFormat.Png);
}
}
}

实现 Stream 以模仿 HttpResponseStream 行为

public class FakeStream : Stream
{
public override bool CanRead { get { return false; } }
public override bool CanSeek { get { return false; } }
public override bool CanWrite { get { return true; } }

public override void Flush() { }

public override long Length { get { throw new NotSupportedException("No Seek"); } }

public override long Position
{
get { throw new NotSupportedException("No Seek"); }
set { throw new NotSupportedException("No Seek"); }
}

public override int Read(byte[] buffer, int offset, int count)
{
throw new InvalidOperationException("Write only stream");
}

public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException("net_noseek");
}

public override void SetLength(long value) { }

public override void Write(byte[] buffer, int offset, int count) { }
}

问题

  1. 如果您运行上面的示例,CauseNotSupportedException 方法中发生的错误将在调用 GetGroups 时抛出。这个怎么可能?任何理论或进一步的见解将不胜感激。
  2. 关于如何进一步调查有什么建议吗?
  3. 有比捕获异常并重试更好的建议吗?这是我们目前的工作。

谢谢。

澄清

我不确定我的解释有多清楚,所以这里有一些澄清。首先,我对获取 Sids 的事件目录代码感到满意。那就是我想要它做的,我认为问题不在于此。真正的问题是,当其他不相关的代码(不在我们的应用程序中)发生错误时,错误会出现在 GetGroups 调用中,因此出现奇怪的堆栈跟踪,错误最初发生在 System.Web.HttpResponseStream.get_Position()。在示例应用程序中,NotSupportedException 发生在 CauseNotSupportedException 中,但代码不会在那里中断,而是在调用 GetGroups 时中断。如果您在示例应用程序中注释掉 CauseNotSupportedException(),则错误永远不会发生。

我不清楚这怎么可能发生。

最佳答案

在调用支持电话后,Microsoft 已针对此问题发布了热修复程序。请参阅下面的链接。

陈述的原因是:“出现此问题是因为 System.DirectoryServices.AccountManagement 命名空间是 native API Active Directory 服务接口(interface) (ADSI) 的精简包装器。由 IADsPathName 接口(interface)实现的 IErrorInfo 接口(interface)响应 ADSI 不抛出的异常。当有如果堆栈上没有 ADSI 异常,IErrorInfo 接口(interface)将抛出位于堆栈顶部的异常,即使该异常由应用程序中的另一个处理程序处理也是如此。”

http://support.microsoft.com/kb/2683913

感谢那些提出建议的人。

关于c# - 在 System.DirectoryServices.AccountManagement 中调用 UserPrinciapl.GetGroups 时出现奇怪的间歇性错误处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8728205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com