C# 带有特殊字符的主机名
在我的WCF服务中,我需要在Bonjour服务中发布它。这样做的原因是让使用我的服务的客户知道它正在运行哪台计算机 这很有效。 但是当我有主机名中带有特殊字符的机器时,该服务的客户就不能吃东西了,因为在解析url时出现了错误 示例:“http://máchine:8888/service.svc” 一种解决方案是使用Think在这里解决机器的IP而不是主机名。但当计算机仅使用IPv6时,我无法发布该服务,因为出现以下错误:“Inalid URI:指定的端口无效。”C# 带有特殊字符的主机名,c#,wcf,ipv6,bonjour,hostname,C#,Wcf,Ipv6,Bonjour,Hostname,在我的WCF服务中,我需要在Bonjour服务中发布它。这样做的原因是让使用我的服务的客户知道它正在运行哪台计算机 这很有效。 但是当我有主机名中带有特殊字符的机器时,该服务的客户就不能吃东西了,因为在解析url时出现了错误 示例:“http://máchine:8888/service.svc” 一种解决方案是使用Think在这里解决机器的IP而不是主机名。但当计算机仅使用IPv6时,我无法发布该服务,因为出现以下错误:“Inalid URI:指定的端口无效。” 如何在不更改主机名的情况下解决
如何在不更改主机名的情况下解决此问题?根据我的经验,在将zeroconf服务映射到URL时,最好不要依赖服务的主机名。将服务解析为IP地址(例如,使用avahi,使用
avahi\u service\u resolver\u new
)并在URL中使用IP地址。这就避免了花哨的主机名和无法解析zeroconf名称的系统解析程序(通常在嵌入式系统上)的各种问题
如果出现类似“Inalid URI:指定的端口无效”的错误,听起来您可能只是忽略了将IP地址括在[方括号]中。用于形成URL的伪代码应为:
if IP address contains ":"
url = "http://[" + ip address + "]:port/whatever"
else
url = "http://" + ip address + ":port/whatever"
另外还有两个并发症:
- 如果您使用的是HTTPS,证书匹配可能会失败,因为证书上的公用名称不匹配。一般来说,不清楚该怎么做,因为自动发现服务的本质通常意味着您无法对服务器进行有意义的身份验证。因此,只需关闭HTTP客户机中的证书验证,您就可以侥幸逃脱
- 您可能无法使用IPv6链接本地地址,因为URL语法的标准(RFC)中存在缺陷,这意味着无法将
字符和接口名称附加到URL中的地址。一些HTTP客户机允许对标准进行明显的扩展以支持作用域地址,但其他客户机不允许(例如,所有主要的web浏览器都不支持!)%
avahi\u service\u resolver\u new
)并在URL中使用IP地址。这就避免了花哨的主机名和无法解析zeroconf名称的系统解析程序(通常在嵌入式系统上)的各种问题
如果出现类似“Inalid URI:指定的端口无效”的错误,听起来您可能只是忽略了将IP地址括在[方括号]中。用于形成URL的伪代码应为:
if IP address contains ":"
url = "http://[" + ip address + "]:port/whatever"
else
url = "http://" + ip address + ":port/whatever"
另外还有两个并发症:
- 如果您使用的是HTTPS,证书匹配可能会失败,因为证书上的公用名称不匹配。一般来说,不清楚该怎么做,因为自动发现服务的本质通常意味着您无法对服务器进行有意义的身份验证。因此,只需关闭HTTP客户机中的证书验证,您就可以侥幸逃脱
- 您可能无法使用IPv6链接本地地址,因为URL语法的标准(RFC)中存在缺陷,这意味着无法将
字符和接口名称附加到URL中的地址。一些HTTP客户机允许对标准进行明显的扩展以支持作用域地址,但其他客户机不允许(例如,所有主要的web浏览器都不支持!)%