2010-01-07 527 views
2

任何與此有關的幫助將不勝感激;我已經待了好幾天了。使用經典ASP發送'application/soap + xml'SOAP請求

下面是我到目前爲止的代碼;不幸的是,當我運行它時,我得到一個HTTP 415錯誤; 無法處理消息,因爲內容類型爲'text/xml; charset = UTF-8'不是預期的類型'application/soap + xml; charset = utf-8'

我必須發送application/soap + xml的內容類型,因爲這是Web服務允許的唯一類型;我必須在傳統的ASP中做到這一點。

我試圖改變「發送」線「objRequest.send objXMLDoc.XML」但這然後給了我一個HTTP 400錯誤的請求錯誤。


strXmlToSend = "<some valid xml>" 
webserviceurl = "http://webservice.com" 
webserviceSOAPActionNameSpace = "avalidnamespace" 

Set objRequest = Server.createobject("MSXML2.XMLHTTP.3.0") 
objRequest.open "POST", webserviceurl, False 

objRequest.setRequestHeader "Content-Type", "application/soap+xml" 
objRequest.setRequestHeader "CharSet", "utf-8" 
objRequest.setRequestHeader "action", webserviceSOAPActionNameSpace & "GetEstimate" 
objRequest.setRequestHeader "SOAPAction", webserviceSOAPActionNameSpace & "GetEstimate" 

Set objXMLDoc = Server.createobject("MSXML2.DOMDocument.3.0") 
objXMLDoc.loadXml strXmlToSend 
objRequest.send objXMLDoc 
set objXMLDoc = nothing 
+0

您可以使用Fiddler或任何HTTP流量分析工具來查看發佈到web服務(從瀏覽器消耗的時間)的內容嗎?然後,讓你的XMLHttpRequest發佈相同的內容。 – shahkalpesh 2010-01-07 12:34:10

+0

@shahkalpesh:你如何讓瀏覽器「使用」Web服務?尤其是一個需要POST方法? – AnthonyWJones 2010-01-07 17:57:09

回答

2

這就是我已經在過去成功應用於:

Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") 
    xmlhttp.open "POST", url, false 
    xmlhttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8" 
    xmlhttp.setRequestHeader "SOAPAction", "http://www.mydomain.com/myaction" 
    xmlhttp.send postdata 
    xml = xmlhttp.responseText 
+0

嗨,謝謝你的回答。不幸的是,我認爲問題在於格式化發送的數據,即使我指定'application/soap + xml',它總是將其視爲'text/xml'。 Registers – Simon 2010-01-07 12:46:26

+0

@Simon - 如果是這樣的話,你會想看看發佈的內容。正如shahkalpesh建議的那樣,嘗試使用fiddler來查看從您的頁面發佈的內容與使用Web服務測試工具(如SoapUI)發佈的內容。這可能是因爲你缺少一些重要的XML(例如肥皂信封) – 2010-01-07 17:53:02

2

當你傳遞一個XML DOM加時賽發送方法的內容類型總是被設置爲「text/xml的」。

如果你想控制內容類型,那麼你必須傳遞一個字符串。不要打擾將XML字符串加載到DOM中只調用xml屬性,因爲這可能會更改xml聲明的內容。順便說一句xml聲明在XML字符串中是什麼樣的,你確定xml是正確的嗎? XML中的編碼聲明是否應該說「UTF-8」。

不發送標題CharSet它意味着什麼,CharSet是Content-Type標題的屬性。

不要使用ASP中的XMLHTTP它不安全。

因此你的代碼應該是這樣的: -

strXmlToSend = "<some valid xml>" 
webserviceurl = "http://webservice.com" 
webserviceSOAPActionNameSpace = "avalidnamespace" 

Set objRequest = Server.Createobject("MSXML2.ServerXMLHTTP.3.0") 
objRequest.open "POST", webserviceurl, False 

objRequest.setRequestHeader "Content-Type", "application/soap+xml; charset=UTF-8" 
objRequest.setRequestHeader "action", webserviceSOAPActionNameSpace & "GetEstimate" 
objRequest.setRequestHeader "SOAPAction", webserviceSOAPActionNameSpace & "GetEstimate" 

objRequest.send strXmlToSend 

不知道這一點「行動」標題要麼看起來superflous給我。也許這仍然會以某種方式失敗,但它不應該再抱怨Content-Type標頭。