虽然通过
BeginSendRequest
和 EndSendRequest
异步请求执行 LDAP 操作非常简单,但我无法确定如何异步完成绑定过程。
是否有可能与SDS.P的LdapConnection异步绑定
正在寻找进行异步 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 搏斗遇到它的互操作。