是否有无服务器绑定的URI的主机名名字对象?

时间:2015-05-22 17:25:13

标签: .net uri uribuilder

我正在构建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?

1 个答案:

答案 0 :(得分:1)

根据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。如果port和username设置为非空字符串,但host为空,那么预期的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遵循约定的某些部分,也不能保证它们在"标准"方式。