如何使用 LdapConnection 异步绑定

问题描述 投票:0回答:1

虽然通过

BeginSendRequest
EndSendRequest
异步请求执行 LDAP 操作非常简单,但我无法确定如何异步完成绑定过程。

是否有可能与SDS.P的LdapConnection异步绑定

.net active-directory adlds
1个回答
1
投票

正在寻找进行异步 LDAP 操作并发现了这个悬而未决的问题。最后自己弄清楚了:

编辑:这似乎仍然没有 100% 有效。似乎 BeginSendRequest() 在使用此方法查找端点/域控制器/LDAP 服务器时实际上会阻塞。当网络配置使服务器不可用时,后来很难发现这一点。我最终只是在 Task.Run() 中使用了同步的东西,然后继续我的生活。

假设您还想在绑定后异步发送/接收 LDAP 请求(不确定为什么要绑定),您可以使用 LdapConnection 上的 AutoBind 属性并在构造函数中预先指定凭据以实现“异步绑定” “,通过使用 BeginSendRequest()/EndSendRequest() 并让它以异步方式在内部处理绑定。

using System.DirectoryServices.Protocols;
using System.Net;
using System.Threading.Tasks;

// ...

using (var connection = 
    new LdapConnection(
        new LdapDirectoryIdentifier("fqdn.example.com", true, false),
        new NetworkCredential("someuser", "somepassword"),
        AuthType.Basic))
{
    // The Answer...
    connection.AutoBind = true;

    var searchResult = await Task.Factory.FromAsync(
            connection.BeginSendRequest, 
            connection.EndSendRequest,
            new SearchRequest(
                "DC=example,DC=com",
                "(objectClass=user)",
                SearchScope.Subtree,
                "distinguishedname"), 
            PartialResultProcessing.NoPartialResultSupport, 
            null);

    // Profit
}

为简洁起见,我将 LdapConnection 上较旧的异步编程模型方法 (APM) 放入为基于任务的异步模式 (TAP) 提供的便捷包装方法中,以便它可以像现代 .Net 项目中预期的那样简单地等待。请参阅:https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/interop-with-other-asynchronous-patterns-and-types

并没有真正准确地回答这个问题,但确实表明你不必自己明确地绑定,也许这就是为什么 MS 没有费心添加 BeginBind() 等。希望这有助于下一个疲倦的程序员与 LDAP 搏斗遇到它的互操作。

© www.soinside.com 2019 - 2024. All rights reserved.