簡體   English   中英

如何將WSDL URL從內部機器名更改為public?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM