我正在为LDAP连接构造一个URI。我知道微软确实支持使用ldap:///cn=...
符号的无服务器绑定,并且该URI将与。net一起工作,但是如果指定了端口,UriBuilder将无法生成正确的URI。
var ub = new UriBuilder();
ub.Scheme = "ldap";
ub.Host = ""
// ---> ub.Uri.ToString() : "ldap:///"
ub.Port = 389
// ---> ub.Uri.ToString() : "ldap:///"
// ok, lets put non-standard port
ub.Port = 3899
// ---> ub.Uri.ToString() : "ldap:///"
ub.UserName = "user"
// ---> ub.Uri.ToString() :
// 'ub.Uri' threw an exception of type 'System.UriFormatException'
EDIT:注意:如果Host
是",给Port
赋值没有效果,给UserName
赋值有异常效果。
这是一个。net问题,还是真的没有一个合适的标准URI用于无服务器绑定?
根据RFC3986,Part是可选的,但是,如果它存在,则"host";是强制性的:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
authority = [ userinfo "@" ] host [ ":" port ]
所以,如果你设置"host"转换为空字符串"userinfo"。和";port"
我不熟悉LDAP,所以不清楚您要生成的URI是什么。如果端口和用户名设置为非空字符串,但主机为空,那么预期的URI是什么样子?
。NET显式支持LDAP uri。这种支持归结为以下标志:
private const UriSyntaxFlags LdapSyntaxFlags =
UriSyntaxFlags.MustHaveAuthority |
//
UriSyntaxFlags.AllowEmptyHost |
UriSyntaxFlags.AllowUncHost |
UriSyntaxFlags.AllowAnInternetHost |
//
UriSyntaxFlags.MayHaveUserInfo |
UriSyntaxFlags.MayHavePort |
UriSyntaxFlags.MayHavePath |
UriSyntaxFlags.MayHaveQuery |
UriSyntaxFlags.MayHaveFragment |
//
UriSyntaxFlags.PathIsRooted |
UriSyntaxFlags.AllowIdn |
UriSyntaxFlags.AllowIriParsing;
UriBuilder
,当这样构造时:
var ub = new UriBuilder {
Scheme = "ldap", Host = "", Path = "/cn=...", UserName = "u", Password = "p", Port = 100
};
在调用ToString()
时产生这个字符串:
ldap://u:p@/cn=...
但是,用这个字符串创建Uri
将会失败。我想这可以被认为是一种限制。这并不是Uri
局限性的第一个案例。例如,它强制将HTTP uri中的路径解析为Windows路径,这在某些情况下可能会令人讨厌并导致错误。
如果您真正感兴趣的是LDAP uri,也许您应该阅读Active Directory的文档。最简单的URI只是一个方案+一些字符串,其余的留给URI实现来决定,标准不强制任何东西。因此,即使一些uri遵循了约定的某些部分,也不能保证它们遵循"标准"。div。