用戶端找到的回應內容類型為 text/html,但需要的是 text/xml

今天在測試程式時發了生一個怪問題,程式中呼叫 Web Service 時會出現「用戶端找到的回應內容類型為 text/html,但需要的是 text/xml」的錯誤訊息,直覺是 Web Service 掛掉了,但直接連到 Web Service 執行又正常,將 Web 參考更新後也是一樣,程式是在 IIS6 執行...

今天在測試程式時發了生一個怪問題,程式中呼叫 Web Service 時會出現「用戶端找到的回應內容類型為 text/html,但需要的是 text/xml」的錯誤訊息,直覺是 Web Service 掛掉了,但直接連到 Web Service 執行又正常,將 Web 參考更新後也是一樣,程式是在 IIS6 執行,錯誤畫面如下:

用戶端找到的回應內容類型為 text/html,但需要的是 text/xml

呼叫端是使用網站的型式開發程式,參考的 Web Service 中有 2 個 asmx 檔案,加入參考後都放在 LabService 中:

WebService參考

Web 參考的名稱分別為 Service1 與 Service2,我呼叫的 Function 是放在 Service2 中,也確認過參考的位置是正確的,Service2 的參考也更新了,但執行時仍會出現錯誤訊息。

後來找到問題,原因是因為我只更新了 Service2 的參考,若將 Service1 一併更新後就正常了,因為 Service1 的參考是從以前的專案拷貝過來使用,而這個參考已經有一段時間,更新後就可以正常呼叫 Service2 的 Function (所以人不要太懶,記得要更新所有參考呀!),只是我仍不清楚為什麼會有這樣的影響?

下面列出一些執行程式呼叫 Web Service 時會出現「用戶端找到的回應內容類型為 text/html,但需要的是 text/xml」的訊息原因:

  1. 帳號沒有程式的執行權限:
    此時直接連至 Server 執行 Web Service 測試會出現類似下面的錯誤訊息:
    .NET 1.1:「拒絕 'D:\xxx\xxxxxx\' 存取。無法啟動監視檔案變更。」
    .NET 2.0:「載入組態檔時發生錯誤: 存取被拒絕,因此無法開始監視 'D:\xxx\xxxxxx' 的變更。」 或是 「伺服器應用程式無法使用」的訊息。

    這種情形,可以開啟安全性設定,檢查執行的帳號是否有程式的執行權限,若無,將權限開啟後即可正常執行。
     
  2. 在 IIS 中,同一個應用程式集區同時設定給不同版本的 .NET 程式執行:
    例如我在應用程式集區設定了 AppPool#NET10 及 AppPool#NET20 二個集區:
     IIS6應用程式集區

    然後設定 ASP.NET 執行的版本,WSLab1 為 .NET 1.1.4322,WSLab2 為 .NET 2.0.50727:
     .NET 執行版本設定

    但是 WSLab1 與 WSLab2 的應用程式集區都是使用 AppPool#NET20:
     指定應用程式集區

    上面的設定方式,將 2 個服務的程式各跑 1 次就會發生不同 .NET 版本使用同樣的資源而造成衝突。

    解決方法:這種情形只要將 2 個應用程式分別設定不同的應用程式集區,再重新啟動 IIS 即可。

  3. Web Service 參考的版本太舊:
    因為 1 支 Web Service 中有 2 個服務(asmx),在呼叫端只有更新有使用到的 Web 參考,另 1 個參考沒有更新,而這 2 個服務都是存在同一個 Web Service 專案中,就會造成此問題。

    直接執行 Web Service 會出現如下訊息:
    直接執行 WebService 時會出現「伺服器應用程式無法使用」訊息

    解決方法:將整個 Web 參考更新過就可以正常執行了。

 

延伸閱讀:

上面第 1 點「帳號沒有程式的執行權限」中提到的錯誤訊息,還有下列 2 篇保哥的文章可以參考 (註:文中問題點與此處不同,只是錯誤訊息相似):

設定安裝性時要注意的事項: