[英]How to change WSDL URL from internal machine name to public?
我有一個簡單的服務,我部署到Azure。 可通過以下方式訪問:
http://xxxxxxxxxxxxxxxxxxxxxxx.cloudapp.net/MyTestService.svc
WSDL的URL使用內部計算機名稱而不是公共DNS:
svcutil.exe http://rd001520d328923a/MyTestService.svc?wsdl
顯然,無法從機器外部訪問WSDL。
我知道如果你在IIS中運行它,或者你知道服務的url,可以改變一些事情。 例如,更改<serviceMetadata>
配置以指定httpGetUrl
屬性,但這不起作用,因為我必須包含絕對URL。 使用相對URL,它仍然使用內部計算機名稱。 真正的問題是WSDL包含帶有機器名的URL引用,因此使它無用。
有兩個不合標准的解決方法:
有人建議我可以抓取WSDL,編輯它來修復URL,然后上傳它,以便可以從不同的URL訪問它。
我發現2010年初有一個修補程序可用,但必須有一個更好的方法。
如何解決公共面向DNS使用而不是機器名稱?
好。 我已經看了將近一個星期了。 我終於找到了答案,因為它不容易獲得,我希望它被索引並節省其他人的時間。
基本上這個整體行為是WCF 3.0 / 3.5的一個已知問題,為此他們發布了一個修補程序。 您可以在此處找到更多信息: FIX:WCF WSDL文檔中的URI引用無法訪問的內部實例而不是負載均衡器...
在我的研究過程中,我曾經遇到過幾次,但從未給出過第二個想法,主要是因為我不知道如何在Azure中部署修補程序。
幸運的是,MSDN論壇的微軟主持人指出,這已在.net 4.0中得到修復。 這意味着上面知識庫文章中推薦的“修復”仍然適用,但不必應用任何修補程序。 那么解決方案是什么? 簡單,將以下內容添加到配置文件中:
<serviceBehaviors>
<behavior name="<name>">
<!-- Other options would go here -->
<useRequestHeadersForMetadataAddress>
<defaultPorts> <!-- Use your own port numbers -->
<add scheme="http" port="81" />
<add scheme="https" port="444" />
</defaultPorts>
</useRequestHeadersForMetadataAddress>
</behavior>
</serviceBehaviors>
就是這樣。 如果能夠更清楚地解決這個問題現在已得到解決,那將是一個更簡單的搜索。 也許我看起來不夠努力。
博客文章使用請求標頭的元數據地址類似於
Victor的回答 ,但解釋說默認端口是可選的,可以省略:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<useRequestHeadersForMetadataAddress/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
它還說明了如何在代碼中啟用行為。
sh.Description.Behaviors.Add(new UseRequestHeadersForMetadataAddressBehavior());
您是否正在生成WSDL以便發布它,或者您只是想在另一個項目中添加引用?
如果是后者,我的建議是使用WCF ChannelFactory方法而不是“添加服務引用”。 我發現它給了我更一致的可控結果。
http://msdn.microsoft.com/en-us/library/ms734681.aspx
我必須補充一點,我沒有在Azure上試過這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.