Sto lavorando all'interfacciamento con un servizio SOAP che sembra non occuparsi degli spazi dei nomi predefiniti, ma funziona bene con gli spazi dei nomi globali e i prefissi dei namespace dichiarati a livello di busta SOAP.Client WCF: forzatura degli spazi dei nomi globali
Il problema è che WCF non crea questi spazi dei nomi globali nella radice, ma utilizza piuttosto spazi dei nomi predefiniti non prefissati che il servizio apparentemente sta soffocando. Ora so che questo non è un errore di WCF - credo che i messaggi generati dalla WCF siano XML validi, ma il servizio lo soffoca comunque.
Uso WCF L'output è generato in questo modo:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:Security xmlns:h="http://docs.oasis-open.org/wss/2004/01/oasis-
...
</h:Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<cancelShipmentRequest xmlns="http://www.royalmailgroup.com/api/ship/V2">
<integrationHeader>
<dateTime xmlns="http://www.royalmailgroup.com/integration/core/V1">2016-03-26T01:44:37.0493801Z</dateTime>
<version xmlns="http://www.royalmailgroup.com/integration/core/V1">2</version>
<identification xmlns="http://www.royalmailgroup.com/integration/core/V1">
<applicationId>RMG-API-G-01</applicationId>
<transactionId>ozhckwej6sxg</transactionId>
</identification>
</integrationHeader>
<cancelShipments>
<shipmentNumber>TTT001908905GB</shipmentNumber>
</cancelShipments>
</cancelShipmentRequest>
</s:Body>
</s:Envelope>
che non funziona.
Utilizzando il seguente envelope SOAP (manualmente SoapUI) non funziona comunque:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:oas="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:v2="http://www.royalmailgroup.com/api/ship/V2"
xmlns:v1="http://www.royalmailgroup.com/integration/core/V1">
<soapenv:Header>
<h:Security xmlns:h="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
</h:Security>
</soapenv:Header>
<soapenv:Body>
<v2:cancelShipmentRequest>
<v2:integrationHeader>
<v1:dateTime>2016-03-02T14:55:00Z</v1:dateTime>
<v1:version>2</v1:version>
<v1:identification>
<v1:applicationId>RMG-API-G-01</v1:applicationId>
<v1:transactionId>wftdaife96gv</v1:transactionId>
</v1:identification>
</v2:integrationHeader>
<v2:cancelShipments>
<v2:shipmentNumber>TTT001908905GB</v2:shipmentNumber>
</v2:cancelShipments>
</v2:cancelShipmentRequest>
</soapenv:Body>
</soapenv:Envelope>
La differenza tra i due è che i namespace V1 e V2 sono dichiarati globalmente nella parte superiore del documento e non ci sono dichiarazioni di spazio dei nomi locali nel secondo documento.
Forse mi manca qualcosa ma per me l'XML generato da WCF sembra valido e rappresenta lo stesso stato del documento in termini di namespace.
L'unica differenza che posso dire è che il modo in cui gli spazi dei nomi sono dichiarati. E anche se la versione di WCF sembra essere valida e produce lo stesso namespacing, il servizio si lamenta di riferimenti di spazio dei nomi non validi.
Impossibile convalida dello schema: messaggio non inviato la convalida dello schema: errore di validità schemi: Element 'xmlns': Questo elemento non è previsto. Previsto è ({http://www.royalmailgroup.com/api/ship/V2} integrationHeader).
La domanda è: qual è il modo migliore per forzare il WCF ad aggiungere i riferimenti dello spazio dei nomi nella parte superiore anziché in linea? L'unico modo che ho trovato finora è quello di usare un'ispettore messaggi e riscrivere esplicitamente il messaggio, ma se passo tutto ciò che potrei fare, creo i messaggi manualmente.
Qualche idea su cosa posso provare a imporre a WCF di utilizzare prefissi di namespace espliciti senza dover riscrivere manualmente i messaggi?
Ho avuto la stessa situazione recentemente cercando di unire uno spazio dei nomi esistente con un nuovo spazio dei nomi .. Non posso dare la risposta definitiva. Quello che ho trovato è stato che dopo aver rimosso il tentativo di unire, ricostruire, uscire da VS e quindi integrare il codice esistente, tutto andava bene. Risposta zoppa, sono d'accordo. Ho concluso che si tratta di un bug in VS, ma troppo complicato per tentare uno scenario di riproduzione. Buona fortuna, e aspetto una soluzione migliore/risposta alla tua situazione. – JamieMeyer
Hai provato i suggerimenti in [questo post del blog] (http://vanacosmin.ro/Articles/Read/WCFEnvelopeNamespacePrefix) o [questa risposta] (http://stackoverflow.com/a/17798306/124386)? –
Grazie Richard. Il post del blog è stato utile e mi ha indirizzato nella giusta direzione. –