Frage

Ich habe einen ASP.NET-Webservice mit folgendem Muster:

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

Ich rufe den Webdienst von ASP aus auf, indem ich Folgendes verwende:

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)

Das Problem, auf das ich stoße, besteht darin, dass, wenn das XML die ProcessMessage-Methode erreicht, die Webdienstinstallation nebenbei einen Standard-Namespace hinzugefügt hat.d.h.Wenn ich einen Haltepunkt in ProcessMessage (XmlDocument-Nachricht) setze, wird Folgendes angezeigt:

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

Wenn ich Pakete auf der Leitung erfasse, kann ich erkennen, dass sich das vom SOAP-Toolkit gesendete XML geringfügig von dem vom .NET WS-Client gesendeten unterscheidet.Das SOAP-Toolkit sendet:

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

Während der .NET-Client Folgendes sendet:

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

Es ist schon so lange her, dass ich das ASP/SOAP-Toolkit zum Aufrufen von .NET-Webservices verwendet habe. Ich kann mich nicht mehr an all die cleveren Tricks/SOAP-Fu erinnern, die ich verwendet habe, um solche Dinge zu umgehen.

Irgendwelche Ideen?Eine Lösung besteht darin, einen COM-aufrufbaren .NET-Proxy einzurichten, der das XML als String-Parameter verwendet und den WS in meinem Namen aufruft, aber das ist eine zusätzliche Ebene an Komplexität/Arbeit, die ich mir erhofft hatte.

War es hilfreich?

Lösung 3

Ich habe das gelöst:

Der SOAP-Client Anfrage Der Knoten hat den Standard-Namespace abgerufen von:

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

Das Hinzufügen eines leeren Standardnamespace zum vom ASP-Client gesendeten XML überschreibt dieses Verhalten:

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

Andere Tipps

Kev,

Ich habe die Lösung gefunden, aber sie ist nicht trivial.

Sie müssen eine benutzerdefinierte Implementierung von IHeaderHandler erstellen, die die richtigen Header erstellt.

Eine gute Schritt-für-Schritt-Anleitung gibt es hier:

http://msdn.microsoft.com/en-us/library/ms980699.aspx

BEARBEITEN:Ich habe dein Update gesehen.Gute Lösung, vielleicht möchten Sie diesen Link trotzdem mit einem Lesezeichen versehen :D

Ich gehe davon aus, dass Sie Zugriff auf den Servicecode haben, nicht nur auf den konsumierenden Client, oder?

Ziehen Sie einfach den Namespace als ersten Teil der Methode aus dem XmlDocument.

Etwas wie:

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

Dann:

[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...
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top