2010-01-07 13 views
2

Toute aide avec ceci serait appréciée; Je suis là depuis quelques jours maintenant.Envoyer une requête SOAP 'application/soap + xml' en utilisant ASP classique

Ci-dessous le code que j'ai jusqu'à maintenant; Malheureusement quand je l'exécute, je reçois une erreur HTTP 415; Impossible de traiter le message car le type de contenu 'text/xml; charset = UTF-8 'n'était pas le type attendu' application/soap + xml; jeu de caractères = utf-8 '.

Je dois envoyer le type d'application content/soap + xml car c'est le seul type autorisé par le service Web; et je dois le faire en ASP classique.

J'ai essayé de changer la ligne 'envoyer' à "objRequest.send objXMLDoc.XML", mais cela me donne alors un HTTP 400 Bad Request erreur.


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

Pourriez-vous utiliser Fiddler ou un outil d'analyse du trafic http pour voir ce qui est POSTé sur le webservice (lorsqu'il est utilisé par le navigateur)? Ensuite, faites en sorte que votre XMLHttpRequest publie le même contenu. – shahkalpesh

+0

@shahkalpesh: Comment obtenez-vous un navigateur pour "consommer" un service Web ?? Surtout l'un nécessite une méthode POST ?. – AnthonyWJones

Répondre

2

Voici ce que je l'ai utilisé avec succès dans le passé:

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

Salut, merci pour la réponse. Malheureusement, je pense que le problème est de formater les données envoyées, il les considère toujours comme 'text/xml' même si je spécifie 'application/soap + xml'. Cordialement – Simon

+0

@Simon - si c'est le cas, vous aurez envie de jeter un oeil à ce qui est posté. Comme l'a suggéré shahkalpesh, essayez le fiddler pour voir ce qui est posté depuis votre page par rapport à ce qui est posté si vous utilisez un outil de test de service web tel que SoapUI. Il se peut qu'il vous manque un code XML important (comme l'enveloppe de savon par exemple) –

2

Lorsque vous passez un DOM XML ot la méthode d'envoi du Content-Type est toujours à « text/xml ".

Si vous souhaitez contrôler le type de contenu, vous devez transmettre une chaîne. Ne vous embêtez pas à charger la chaîne XML dans un DOM uniquement pour appeler la propriété xml car cela peut changer le contenu de la déclaration xml. BTW à quoi ressemble la déclaration xml dans la chaîne XML et êtes-vous certain que le xml est correct? L'encodage sur le xml declare si présent devrait dire "UTF-8".

N'envoyez pas d'en-tête CharSet cela ne signifie rien, CharSet est un attribut de l'en-tête Content-Type. N'utilisez pas XMLHTTP de l'intérieur de l'ASP, ce n'est pas sûr.

D'où votre code devrait ressembler à ceci: -

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 

ne suis pas sûr que "l'action" en-tête soit me semble superflu. Peut-être que cela échouera encore d'une certaine façon, mais il ne devrait plus se plaindre de l'en-tête Content-Type.