4

次のリンクに Web サービスがあります: http://abc.com/asmx

次のコードを使用して、webservice getcustomers にリクエストを送信しました。

<%
DIM PostData, strStatus, strRetVal, postUrl

PostData = _
"<?xml version=""1.0"" encoding=""utf-8""?>" &_
"<soap:Envelope xmlns:env=""http://www.w3.org/2001/XMLSchema-instance"" &_
"xmlns:xsd='http://www.w3.org/2001/XMLSchema'" &_
"xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">" &_
  "<soap:Body>" &_
  " <getCustomer xmlns=""http://3dcart.com/"">" &_
  "<storeUrl>www.abc.stores.com/</storeUrl>" &_
  "<userKey>sdfsf</userKey>" &_
  "<batchSize>1</batchSize>" &_
  "<startNum>1</startNum>" &_
   "<customersFilter>firstname=John</customersFilter>"&_ 
    "<callBackURL></callBackURL>"&_ 
    "</getCustomer>"&_
     "</soap:Body>" &_
"</soap:Envelope>"

response.write("req=" & Server.HTMLEncode(PostData) & "<br/>len=" & len(PostData))
postUrl = "http://abc.com/cart.asmx?op=getCustomer"
Set xmlHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
xmlHTTP.open "POST", postUrl, false
xmlHTTP.setRequestHeader "Content-Type", "text/xml; charset=utf-8" 
'xmlHTTP.setRequestHeader "SOAPAction", "http://AvailReceive/AvailRq"
xmlHTTP.send PostData
strStatus = xmlHTTP.Status
strRetval = xmlHTTP.responseText
set xmlHTTP = nothing
response.write("<br/>") 
response.write("status=" & strStatus & "<br/>resp=" & strRetval)
%>

しかし、エラーが発生しています: resp=soap:ReceiverServer はリクエストを処理できませんでした。---> 「http」は予期しないトークンです。空白を期待しています。1 行目、163 桁目。

このエラーが発生する理由を教えてください。解決策は何ですか。

4

1 に答える 1

3

はい:

500 エラー (「空白が必要です」) が発生する理由は、メッセージの形式が正しくないためです。xml メッセージにいくつかの xmlns 宣言があり、vbscript のバグのため、それらの間にスペースがありません。結果は無効な XML であり、サーバーはそれが原因でエラーを返しています。

また:

  • envプレフィックスとxsdメッセージの名前空間宣言は実際には必要ありません。それらは決して使用されません。
  • soapプレフィックスも必要ありません。デフォルトの XML 名前空間を設定するだけです。
  • xmlns 宣言には一重引用符を使用できます。これにより、コードが読みやすくなります。
  • xml メッセージに改行と空白を挿入できます。これにより、コード、特に送信メッセージのコードが読みやすくなります。

これらの提案された変更を使用すると、適切に機能するコードがいくつかあります。

Dim msg, strStatus, strRetVal, postUrl

msg = "<?xml version='1.0' encoding='utf-8'?>" &_
         "<Envelope xmlns='http://schemas.xmlsoap.org/soap/envelope/'>" & VbCrLf &_
         "  <Body>" & VbCrLf &_
         "    <getCustomer xmlns='http://abc.com/'>" & VbCrLf &_
         "      <storeUrl>www.abc.com/</storeUrl>" & VbCrLf &_
         "      <userKey>345</userKey>" & VbCrLf &_
         "      <batchSize>1</batchSize>" & VbCrLf &_
         "      <startNum>1</startNum>" & VbCrLf &_
         "      <customersFilter>firstname=John</customersFilter>"& VbCrLf &_
         "      <callBackURL></callBackURL>"& VbCrLf &_
         "    </getCustomer>" & VbCrLf &_
         "  </Body>" & VbCrLf &_
         "</Envelope>"

Response.write("req=" & Server.HTMLEncode(msg) & "<br/>len=" & len(msg))

postUrl = "http://abc.com/cart.asmx?op=getCustomer"

Set xmlHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
xmlHTTP.open "POST", postUrl, false
xmlHTTP.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
'xmlHTTP.setRequestHeader "SOAPAction", "http://AvailReceive/AvailRq"
xmlHTTP.send msg

strStatus = xmlHTTP.Status
strRetval = xmlHTTP.responseText
set xmlHTTP = nothing
Response.write("<br/>")
Response.write("status=" & strStatus & "<br/>resp=" & strRetval)

しかし ...このコードは、.ASMX スクリプトの実行時エラーを明らかにします。

resp=ストアからデータを取得しようとしてエラーが発生しました。技術的な説明: リモート名を解決できませんでした: 'www.abc.com'

送信メッセージを変更して、ホスト名をabc.comではなくとして指定するwww.abc.comと、適切な応答が得られます。

于 2012-04-25T22:13:47.277 に答える