2013-06-12 17 views
1

在我的WCF服务中,我需要将它发布在Bonjour服务中。其原因是为了让使用我的服务的客户知道它正在运行的计算机。特殊主角的主机名

这效果很好。 但是,当我在HostName中具有特殊字符的机器时,此服务的客户无法进食,因为解决该url时发生错误。

例:“HTTP://机:8888/service.svc”

一种解决方案是使用以为这里解决了机器的IP来代替主机名。但是,当计算机仅与IPv6协同工作时,我无法发布该服务,因为发生了以下错误:“Inalid URI:指定了无效的端口。”

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

+1

您是否在寻找“如何在WCF服务中使用无效主机名”或“如何正确指定[IDN](http://en.wikipedia.org/wiki/Internationalized_Domain_Names)”或其他? –

+0

您是否尝试过在[punycode](http://en.wikipedia.org/wiki/Punycode)中表达该名称?请参阅[IDN](http://en.wikipedia.org/wiki/Internationalized_domain_name)。 – McDowell

回答

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客户端允许标准的明显扩展来支持有限范围的地址,但其他HTTP客户端则不支持(例如,所有主要的Web浏览器都不支持!)。
+0

感谢您的提示。 ;) – ECC