1

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

这很好用。但是当我有HostName中有特殊字符的机器时,这个服务的客户不能吃,因为及时解析url出现错误。

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

一种解决方案是在这里使用思想来解决机器的 IP 代替主机名。但是当计算机仅使用 IPv6 时,我无法发布服务,因为出现以下错误:“Inalid URI: Invalid port specified。”

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

4

1 回答 1

1

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

如果您收到类似“Inalid URI: Invalid port specified.”之类的错误,听起来您可能只是忽略了将 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 浏览器都不允许!)。
于 2013-06-12T21:21:19.127 回答