带有特殊字符的主机名

时间:2013-06-12 20:54:11

标签: c# wcf ipv6 bonjour hostname

在我的WCF服务中,我需要在Bonjour服务中发布它。这样做的原因是让使用我服务的客户知道它正在运行哪台计算机。

这很有效。 但是当我在HostName中使用具有特殊字符的计算机时,此服务的客户无法进食,因为在解析网址时出现错误。

示例:“http://máchine:8888 / service.svc”

一种解决方案是使用思想来解决机器的IP而不是主机名。但是当计算机仅使用IPv6时,我无法发布服务,因为发生以下错误:“Inalid URI:指定了无效的端口。”

如何在不更改HostName的情况下解决此问题?

1 个答案:

答案 0 :(得分:1)

根据我的经验,在将zeroconf服务映射到URL时,最好不要依赖服务的主机名。将服务解析为IP地址(例如,使用avahi,使用avahi_service_resolver_new)并使用URL中的IP地址。这避免了花哨的主机名和无法解析零配置名称的系统解析器的各种问题(通常是嵌入式系统上的情况)。

如果您收到类似“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浏览器都没有!)。