2010-07-30 48 views
2

我們在部署可在我們的開發環境中工作但未在生產中的Web服務時遇到問題。部分問題是我們的生產服務器負載均衡,因此要升級其中一臺服務器,我們必須將其從負載平衡中解放出來,並試圖單獨測試服務器,這是一個挑戰。爲什麼我可以從瀏覽器訪問WSDL文件,但不能從應用程序訪問?

我正在使用的計算機叫做Web01,我用來測試的計算機叫做Ts01。在這兩臺機器上,我修改了主機文件以將mydomain.com重定向到Web01上的網站的推測IP。

我測試每一臺機器上訪問Web服務的方法有兩種:

  • 一個簡單的瀏覽器調用http://www.mydomain.com/services/myservice.asmx?WSDL
  • 一個VB6測試應用程序,它使用上面通過SOAPClient引用的WSDL調用Web服務。

以下是測試結果:

 
        Browser    VB6 App 
    Ts01    OK     OK 
    Web01   OK     ERROR 

測試似乎除了用於安裝在Web服務器上的VB6應用程序於所有情況確定。錯誤我得到的回覆是:

-2147024809 - WSDLReader - :XML解析器未能在行號0,lineposition 0,原因是:系統無法找到對象指定WSDLReader HRESULT = 80070057的WSDL文件加載失敗。

HRESULT =爲0x1

我得到同樣的錯誤回到Ts01,如果我在VB6應用程序提供一個糟糕的WSDL地址。似乎Web01上的VB6應用程序無法訪問Web01上的Web服務DLL,這是一個大問題。

值得一提的是,它也適用於我的本地開發人員計算機,我的VB6應用程序和Web服務安裝在同一臺計算機上。

爲什麼VB6應用程序在與Web服務存在的同一個框中運行時,可能無法通過SOAPClient與Web服務進行通信?


我使用fiddler來檢查我的本地計算機上調用我們的開發服務器的請求頭。下面是瀏覽器和SoapClient的請求之間的區別:

瀏覽器:

GET http://devserver/services/myservice.asmx?WSDL HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-shockwave-flash, */* 
Accept-Language: en-us 
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 
Host: devserver 
Cookie: SIFR-PREFETCHED=true 

的SOAPClient(從VB6應用程序):

GET http://devserver/services/myservice.asmx?WSDL HTTP/1.1 
Accept: */* 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) 
Host: hbhswebnet 
Connection: Keep-Alive 
Pragma: no-cache 

我不知道,如果這些信息是有幫助的,但也許它是。

+0

你認爲這可能是一個權限錯誤? Web01上的VB6應用程序可能沒有權限進行SOAPClient調用。 – 2010-07-30 19:07:31

+0

我不認爲這是一個編程問題;它屬於ServerFault – 2010-07-30 19:12:56

+0

您是否正在通過Web代理訪問遠程計算機? – 2010-07-30 19:28:30

回答

3

這裏有一個通用的模式:

問:「X」工程在瀏覽器,但在在做瀏覽器做同樣的事情的程序失敗。怎麼了?

A:該程序是而不是做瀏覽器正在做同樣的事情。

瀏覽器明確設置程序未設置的標題(尤其是因爲您使用的是非常過時的SOAPClient)。各種網絡設備和軟件可能會在決定如何響應您的請求時查看這些標題。

您應該使用Fiddler或其他東西來查看這兩種情況(瀏覽器和程序)的網絡流量,然後仔細查看瀏覽器行爲方式和程序行爲方式之間的差異。然後,您可以將程序更改爲瀏覽器,或者請求網絡人員請降低安全性,以便您的程序可以訪問該服務。

+0

這是偉大的建議,尤其是。使用Fiddler的想法。我沒有想過要這樣做來檢查請求頭。我猜最讓我吃驚的是它在一臺機器上工作*,而不是真正負責撥打電話的機器。 – 2010-07-30 19:43:41

+0

@Ben:根據您發佈的標題,我會問網絡人員有關SIFR-PREFETCHED = true cookie的信息。 – 2010-07-30 19:53:31

0

另一個需要關注的問題是瀏覽器中的代理設置,你是否要通過代理? VB6從Internet Explorer中獲取一些但不是全部的代理設置,但沒有從任何其他瀏覽器獲取。

如果Fiddler不起作用,您可能需要捲起你的小辮並挖掘到Wireshark,以瞭解VB6爲什麼不通信。

另一個需要注意的重要問題是,您使用的是SOAP客戶端? (微軟過時的和有問題的客戶端,PocketSOAP,家裏釀造的東西?)一個建議可能是爲.Net寫一個soap代理,然後使用interop來處理你的肥皂。

0

「WSDLReader錯誤」80020009' WSDLReader:XML分析器在佈線0,線路位置0時失敗,原因是:服務器名稱或地址無法解析HRESULT = 0x1:函數不正確 - WSDLReader:加載WSDL文件失敗HRESULT = 0x80070057:參數不正確 - 客戶端:提供的參數之一是無效的HRESULT = 0x80070057:參數不正確「

Windows Update損壞的註冊表和Web應用程序不會啓動任何與您的網站相關的對象服務,你會得到這個錯誤。 嘗試重新註冊SOAP客戶端和SOAP Dll或嘗試重新安裝它們。

+0

您是否閱讀過接受的答案? – 2012-10-19 21:33:10

0

WSDL文件和/或服務本身可能需要身份驗證。在我的情況下(假設基本身份驗證),我必須提供憑證到SOAP連接URL,因此:

http://www.mydomain.com/services/myservice.asmx?WSDL 

變爲:

http://user:[email protected]/services/myservice.asmx?WSDL 

當然,這是在公共互聯網上完全沒有安全感,所以你應該使用HTTPS。如果可能,您還應該將連接限制在可信主機上。

這可能會或可能不會與某些安全更新工作,你的瀏覽器或MSXML:

https://support.microsoft.com/default.aspx?scid=kb;en-us;832414

在這種情況下,您可能需要提供使用其他方法的憑據。如果你能得到的WSDL文件沒有憑據訪問,你仍然可以確保與證書服務,並通過他們在SOAP信封:

sc.ssoapinit(WSDLURL) 
    sc.ConnectorProperty("AuthUser") = "user" 
    sc.ConnectorProperty("AuthPassword") = "password" 
0

有同樣的問題。代碼將在我的機器上工作,但不在客戶端上。必須加載IE-Tools-Internet選項並點擊高級。向下滾動到安全性並取消選中「不要將加密的頁面保存到磁盤」。

相關問題