1. 程式人生 > >WCF發布後遠程訪問的域名解析問題

WCF發布後遠程訪問的域名解析問題

proc 瀏覽器中 如果 ice 域名 com 定義 message 本地

環境:

VS2010 sp1,.net framework 4.0,windows server 2003 x64 ,iis 6.0

癥狀:

WCF開發測試,本地調用都正常。發布後,在瀏覽器中訪問http://ip/Service.svc,可以正常瀏覽,但svcutil.exe 顯示的是域名:http://域名/Service.svc。

在VS中,添加服務引用,地址輸入http://ip/Service.svc,點擊前往,提示錯誤,內容如下:

技術分享圖片
URI http://ip/Service.svc 處的文檔未被識別為已知的文檔類型。
來自各已知類型的錯誤信息可能有助於修復該問題:
- 來自“XML 架構”的報告是“無法識別此文檔格式(內容類型為“text/html; charset=UTF-8”)。”。
- 來自“http://ip/Service.svc”的報告是“無法識別此文檔格式(內容類型為“text/html; charset=UTF-8”)。”。
- 來自“DISCO 文檔”的報告是“下載“http://域名/Service.svc?disco”時出錯。”。
  - 未能解析此遠程名稱: ‘域名‘
- 來自“WSDL 文檔”的報告是“無法識別此文檔格式(內容類型為“text/html; charset=UTF-8”)。”。
元數據包含無法解析的引用:“http://域名/Service.svc”。
服務 http://ip/Service.svc 不支持內容類型 application/soap+xml; charset=utf-8。客戶端和服務綁定可能不匹配。
遠程服務器返回錯誤: (415) Cannot process the message because the content type ‘application/soap+xml; charset=utf-8‘ was not the expected type ‘text/xml; charset=utf-8‘.。
如果該服務已在當前解決方案中定義,請嘗試生成該解決方案,然後再次添加服務引用。
技術分享圖片

解決方案:
網上看了很多帖子,有說ip綁定的,有說設置防火墻的,等等,試過都不行。

很多網友都遇到此問題,非常郁悶,抱著大無畏的探索精神,最終找到兩個解決方案:

1、修改客戶端hosts文件,路徑C:\Windows\System32\drivers\etc,在hosts文件裏添加一個映射:

ip 域名

例如:102.54.94.97 rhino.acme.com

2、上面的辦法,顯然很山寨,我們不能要求使用服務的每一個客戶端都去修改自己的hosts文件。最終還是需要在服務端解決。

解決方案參考:http://support.microsoft.com/kb/971842

When you use a Windows Communication Foundation (WCF) service in load-balanced scenarios in the Microsoft .NET Framework 3.0 in Windows Server 2003, Windows XP, Windows Vista and Windows Server 2008, you experience one or more of the following issues:

.....

In this scenario, when you try to generate a proxy from the metadata, the process fails because the metadata contains URIs that reference internal Web site instances.

步驟:

首先下載補丁包:http://archive.msdn.microsoft.com/KB971842/Release/ProjectReleases.aspx?ReleaseId=3228

安裝後會提示重啟,忽略之。

然後修改wcf的配置文件,添加紅色部分部門,或者通過wcf配置文件編輯器,添加useRequestHeadersForMetadataAddress配置

技術分享圖片
<behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <useRequestHeadersForMetadataAddress>
            <defaultPorts>
              <add scheme="http" port="8002" />
              <add scheme="https" port="8002" />
            </defaultPorts>
          </useRequestHeadersForMetadataAddress>
        </behavior>
      </serviceBehaviors>
    </behaviors>
技術分享圖片


重新發布,問題解決。

WCF發布後遠程訪問的域名解析問題