2013-06-12 24 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