Aufruf ASP.NET Web-Service von ASP Soapclient


3

Ich habe eine ASP.NET-Webservice mit entlang der Linien von:

[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 den Web-Service von ASP aufrufen, wie etwas mit:

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, das mir begegnet, ist, dass, wenn das XML die ProcessMessage-Methode erreicht, die Web-Service-Installation einen Standard-Namespace hinzugefügt hat. dh wenn ich einen Haltepunkt in Process (XmlDocument Nachricht) gesetzt Ich sehe:

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

Wenn ich Pakete erfassen auf dem Draht kann ich sehen, dass die XML durch den SOAP-Toolkit geschickt aus, dass von .NET gesendet etwas anders WS-Client. Der 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 das .NET-Client 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 gewesen ist, so lange, da ich das ASP/SOAP-Toolkit verwendet in .NET Web Service zu nennen, ich kann mich nicht erinnern, all die cleveren Tricks/SOAP-Fu, die ich benutzt habe, um solche Sachen zu umgehen.

Irgendwelche Ideen? Eine Lösung besteht darin, einen COM-aufrufbaren .NET-Proxy hochzufahren, der den XML-Code als String-Parameter verwendet und den WS in meinem Auftrag aufruft, aber es ist eine zusätzliche Ebene der Komplexität/Arbeit, die ich nicht zu tun hoffte.

0

Ich löste dies:

Der SOAP-Client Anfrage Knoten den Standard-Namespace von der Kommissionierung bis wurde:

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

einen leeren Standard-Namespace an den vom ASP-Client überschreibt dieses Verhalten gesendet XML Hinzufügen:

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

0

Ich nehme an, Sie haben Zugriff auf die Dienste-Code, nicht nur die konsumierenden Client Recht?

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

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

1

Kev,

ich die Lösung gefunden, aber es ist nicht trivial.

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

Es ist ein guter Schritt für Schritt hier:

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

EDIT: Ich habe Ihr Update sah.Schöne Workaround, möchten Sie vielleicht diese Verknüpfung unabhängig von Lesezeichen: D

  0

Yep ... Lesezeichen ... :) +1 08 jan. 092009-01-08 14:36:32