Question

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 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 à diresi 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>

Lorsque j'ai fait une capture de 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>

Alors 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.

Était-ce utile?

La solution 3

J'ai résolu ce problème:

Le client SOAP demande le nœud a été ramasser l'espace de noms par défaut à partir de:

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

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

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

Autres conseils

Kev,

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

Vous avez besoin de créer une implémentation personnalisée de IHeaderHandler qui crée la bonne en-têtes.

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 :D

- Je prendre, vous avez accès aux Services code, et pas seulement la consommation droit du client?

Il suffit de tirer l'espace de noms de la XmlDocument que la 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;
    }
}

Alors:

[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...
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top