是否有用于无服务器绑定的 URI 的主机名名字对象?
Is there a hostname moniker for URI with serverless bindings?
我正在为 LDAP 连接构建 URI。我知道 Microsoft 确实支持使用 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'
编辑:注意:如果Host
为“”,则给Port
赋值无效,给UserName
赋任何值具有异常效果。
这是 .NET 问题,还是根本就没有适合无服务器绑定的标准 URI?
根据 RFC3986,“authority”部分是可选的,但是,如果它存在,则“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 遵循某些约定,也不能保证它们以“标准”方式执行。
我正在为 LDAP 连接构建 URI。我知道 Microsoft 确实支持使用 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'
编辑:注意:如果Host
为“”,则给Port
赋值无效,给UserName
赋任何值具有异常效果。
这是 .NET 问题,还是根本就没有适合无服务器绑定的标准 URI?
根据 RFC3986,“authority”部分是可选的,但是,如果它存在,则“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 遵循某些约定,也不能保证它们以“标准”方式执行。