2008-08-21 28 views
3

J'ai un webservice ASP.NET avec le long des lignes de:Appel service Web ASP.NET à partir d'ASP à l'aide SOAPClient

[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 
    } 
} 

J'appelle 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 XML atteint la méthode ProcessMessage, la plomberie du service Web a ajouté un espace de nom par défaut en cours de route. à savoir si je mets un point d'arrêt à l'intérieur ProcessMessage (message XmlDocument) Je vois:

<request xmlns="http://internalservice.net/messageprocessing"> 
    <task>....various xml</task> 
</request> 

Lorsque je capture des paquets sur le fil que je peux voir que le XML envoyé par la boîte à outils SOAP est légèrement différent de celui envoyé par le .NET Client WS. La boîte à outils SOAP 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> 

Alors que le client .NET 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 que je la boîte à outils ASP/SOAP pour appeler en webservices .NET, je ne me souviens pas toutes les astuces/SOAP-fu que j'avais l'habitude de tirer pour contourner des trucs comme ça.

Des idées? Une solution consiste à assommer un proxy .NET appelable COM qui prend le XML comme un paramètre de chaîne et appelle le WS en mon nom, mais c'est une couche supplémentaire de complexité/travail que j'espérais ne pas faire.

Répondre

0

Je résolu ceci:

Le noeud demande client SOAP ramassait l'espace de noms par défaut de:

<ProcessMessage xmlns="http://internalservice.net/messageprocessing"> 

Ajout d'un espace de noms par défaut vide XML envoyé par le client ASP remplace ce comportement:

xmlMessage = "<request xmlns=''><task>....various xml</task></request>" 
0

Je suppose que vous avez accès au code Services, et pas seulement au client consommateur?

Extrayez simplement l'espace de nom du XmlDocument en tant que première partie de la méthode.

Quelque chose comme:

XmlDocument changeDocumentNamespace(XmlDocument doc, string newNamespace) 
{ 
    if (doc.DocumentElement.NamespaceURI.Length > 0) 
    { 
     doc.DocumentElement.SetAttribute("xmlns", newNameSpace); 
     XmlDocument newDoc = new XmlDocument(); 
     newDoc.LoadXml(doc.OuterXml); 
     return newDoc; 
    } 
    else 
    { 
     return doc; 
    } 
} 

Puis:

[WebService(Namespace = "http://internalservice.net/messageprocessing")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ToolboxItem(false)] 
public class ProvisioningService : WebService 
{ 
    [WebMethod] 
    public XmlDocument ProcessMessage(XmlDocument message) 
    { 
     message = changeDocumentNamespace(message,String.Empty); 
     // Do Stuff... 
    } 
} 
1

Kev,

J'ai trouvé la solution, mais ce ne est pas trivial.

Vous devez créer une implémentation personnalisée de IHeaderHandler qui crée les en-têtes appropriés.

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 voudrez peut-être marquer ce lien indépendamment: D

+0

Oui oui ... marqué ... :) +1 – Kev