Domanda

Ho un servizio web ASP.NET sulla falsariga di:

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

Sto chiamando il servizio web da ASP utilizzando qualcosa del tipo:

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)

Il problema che sto riscontrando è che quando l'XML raggiunge il metodo ProcessMessage, l'impianto idraulico del servizio Web ha aggiunto uno spazio dei nomi predefinito lungo il percorso.cioè.se imposto un punto di interruzione all'interno di ProcessMessage(messaggio XmlDocument) vedo:

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

Quando acquisisco i pacchetti in transito, posso vedere che l'XML inviato dal toolkit SOAP è leggermente diverso da quello inviato dal client .NET WS.Il toolkit SOAP invia:

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

Mentre il client .NET invia:

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

È passato così tanto tempo dall'ultima volta che ho utilizzato il toolkit ASP/SOAP per chiamare i servizi Web .NET, non riesco a ricordare tutti i trucchi intelligenti/SOAP-fu che ho usato per aggirare cose come questa.

Qualche idea?Una soluzione è creare un proxy .NET richiamabile COM che prenda l'XML come parametro di stringa e chiami WS per mio conto, ma è un ulteriore livello di complessità/lavoro che speravo di non fare.

È stato utile?

Soluzione 3

Ho risolto questo:

Il cliente SOAP richiesta il nodo stava prelevando lo spazio dei nomi predefinito da:

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

L'aggiunta di uno spazio dei nomi predefinito vuoto all'XML inviato dal client ASP sovrascrive questo comportamento:

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

Altri suggerimenti

Kev,

Ho trovato la soluzione, ma non è banale.

È necessario creare un'implementazione personalizzata di IHeaderHandler che crei le intestazioni corrette.

C'è un buon passo passo qui:

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

MODIFICARE:Ho visto il tuo aggiornamento.Bella soluzione alternativa, potresti voler aggiungere questo collegamento ai segnalibri indipendentemente: D

Immagino che tu abbia accesso al codice dei servizi, non solo al cliente che lo consuma, giusto?

Basta estrarre lo spazio dei nomi da XmlDocument come prima parte del metodo.

Qualcosa di simile a:

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

Poi:

[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...
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top