L'appel ASP.NET service web à partir d'ASP à l'aide de SOAPClient
J'ai un ASP.NET webservice avec le long des lignes de:
[WebService(Namespace = "http://internalservice.net/messageprocessing")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class ProvisioningService : WebService
{
[WebMethod]
public XmlDocument ProcessMessage(XmlDocument message)
{
//... do stuff
}
}
Je vais appeler le service web à partir d'ASP en utilisant quelque chose comme:
provWSDL = "http://servername:12011/MessageProcessor.asmx?wsdl"
Set service = CreateObject("MSSOAP.SoapClient30")
service.ClientProperty("ServerHTTPRequest") = True
Call service.MSSoapInit(provWSDL)
xmlMessage = "<request><task>....various xml</task></request>"
result = service.ProcessMessage(xmlMessage)
Le problème que je rencontre est que lorsque le fichier XML atteint la méthode ProcessMessage, le web service de plomberie a ajouté un espace de noms par défaut le long de la voie. c'est à dire si j'ai mis un point d'arrêt à l'intérieur de ProcessMessage(XmlDocument message) je vois:
<request xmlns="http://internalservice.net/messageprocessing">
<task>....various xml</task>
</request>
Quand je capture les paquets sur le fil, je vois que le fichier XML envoyé par le SOAP toolkit est légèrement différent de celui envoyé par l' .NET WS client. Le SOAP toolkit envoie:
<SOAP-ENV:Envelope
xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"
xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ProcessMessage xmlns="http://internalservice.net/messageprocessing">
<message xmlns:SOAPSDK4="http://internalservice.net/messageprocessing">
<request>
<task>...stuff to do</task>
</request>
</message>
</ProcessMessage>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Tandis que l' .NET client envoie:
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ProcessMessage xmlns="http://internalservice.net/messageprocessing">
<message>
<request xmlns="">
<task>...stuff to do</task>
</request>
</message>
</ProcessMessage>
</soap:Body>
</soap:Envelope>
Il a été si longtemps depuis que j'ai utilisé l'ASP/SOAP toolkit pour l'appeler .NET, webservices, je ne me souviens pas de tous les trucs astucieux/SOAP-fu que j'ai utilisé pour tirer à contourner des trucs comme ça.
Des idées? Une solution est de frapper un callable de COM .NET proxy qui prend le XML comme un string param et appelle le WS en mon nom, mais c'est une couche supplémentaire de complexité/travail, j'espère ne pas faire.
OriginalL'auteur Kev | 2008-08-21
Vous devez vous connecter pour publier un commentaire.
Kev,
J'ai trouvé la solution, mais ce n'est pas trivial.
Vous avez besoin pour créer une implémentation personnalisée de IHeaderHandler qui crée la bonne têtes de.
Il y a une bonne étape par étape ici:
http://msdn.microsoft.com/en-us/library/ms980699.aspx
EDIT: j'ai vu votre mise à jour. Belle solution de contournement, vous pouvez l'ajouter à vos favoris le lien, peu importe 😀
OriginalL'auteur FlySwat
- Je prendre, vous avez accès aux Services code, et pas seulement de consommer de la client?
Il suffit de tirer l'espace de noms de la XmlDocument que la première partie de la méthode.
Quelque chose comme:
Alors:
OriginalL'auteur FlySwat
J'ai résolu ce problème:
Le client SOAP demande nœud a été ramasser l'espace de noms par défaut à partir de:
L'ajout d'un vide par défaut de l'espace de noms XML envoyé par le client ASP remplace ce comportement:
OriginalL'auteur Kev