2010-07-26 24 views
10

Ho un SODL SOAP (trovato qui: https://portal.bsh-partner.com/picenter/server/a2a/) e sto cercando di utilizzare i servizi Web.Consumo di servizi Web SOAP in ASP.NET

var soapEnvelope = string.Empty; 
soapEnvelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; 
soapEnvelope += "<soapenv:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:q0=\"http://thexmlhost.com\">"; 
soapEnvelope += "<q0:Connect>"; 
soapEnvelope += "<q0:Username>username</q0:Username>"; 
soapEnvelope += "<q0:Password>password</q0:Password>"; 
soapEnvelope += "</q0:Connect>"; 
soapEnvelope += "</soapenv:Body>"; 
soapEnvelope += "</soapenv:Envelope>"; 

var xmlHttp = new MSXML2.ServerXMLHTTP40(); 
xmlHttp.open("POST", "https://thexmlhost.com/", "", ""); 
xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); 
xmlHttp.setRequestHeader("SOAPAction", "thexmlhost.com/"); 

xmlHttp.send(soapEnvelope); 

xmlHttp.waitForResponse(500); 

var outXml = xmlHttp.responseText; 

La risposta continua a restituire una pagina di errore di risposta HTTP generale. Qualche idea su come dovrei passare il mio Soap Envelope per ottenere la risposta adeguata dal servizio web?

+3

Perché nel mondo costruisci un messaggio di sapone a mano? –

+2

Idk se dovrei sospendere questo perché è un così grande esempio di errore o svalutazione per lo stesso motivo ... –

risposta

9

Ho appena notato che state usando questo codice sul lato server.


Questo non è il modo di utilizzare i servizi Web in .NET. Utilizzare il comando "Aggiungi riferimento servizio" in Visual Studio per creare classi proxy che consentano di utilizzare molto facilmente il servizio.

Vedere How to Consume a Web Service per un esempio, nonché http://msdn.microsoft.com/wcf/.

Inoltre, mai utilizzare tecniche di manipolazione di stringhe quando si lavora con XML. In breve, le regole per le stringhe e per XML sono diverse. .NET ha diverse API XML per lavorare con XML e tutti conoscono le regole.

+0

Cosa intendevi per "Di solito è meglio consumare un servizio SOAP dal lato server. È molto più semplice ". ? –

+0

@Allen: fino a quando ho notato "' string.Empty' ", ho pensato che fosse JavaScript. –

+0

ahhh che ha senso –

3

Proprio guardando il codice, sembra che ti sei dimenticato di aggiungere il tag di apertura del corpo: <soapenv:Body>

Se non avete un motivo particolare per essere costruire il messaggio manualmente, mi raccomando utilizzando un proxy generato utilizzando il strumento svcutil.exe fornito con Visual Studio 2008 o versioni successive. (questo strumento viene utilizzato automaticamente da Visual Studio se si utilizza la funzione "Aggiungi riferimento servizio"), presupponendo che non si abbia problemi con l'utilizzo di WCF per gestire le comunicazioni con il proprio servizio Web.

In alternativa, se per qualche motivo non è possibile utilizzare WCF, ad esempio se si sta sviluppando in .Net 2.0 con Visual Studio 2005, nel qual caso non si disporrà della funzionalità "Aggiungi riferimento servizio" disponibile, potrebbe utilizzare ancora la funzione "Aggiungi riferimento Web" di Visual Studio per generare un proxy per il proprio servizio Web. Questa funzione utilizza lo strumento wsdl.exe piuttosto che svcutil.exe.

Altrimenti, se davvero si deve continuare con questo approccio di costruzione manuale del messaggio SOAP, allora consiglio di aggiungere qualche registrazione alla propria applicazione in modo da poter analizzare più facilmente il messaggio costruito quando qualcosa va storto.

+0

(cancellato il mio commento precedente a causa di essere probabilmente errato) accolgo il vostro punto; a questo punto WCF dovrebbe essere l'approccio raccomandato, se disponibile. Si noti che un numero di collegamenti su MSDN in Servizi Web ASP.NET VS2010 (http://msdn.microsoft.com/en-us/library/yzbxwf53.aspx) menzionano specificamente che la funzionalità "Riferimento Web"/wsdl.exe è legacy e viene fornito per compatibilità con le versioni precedenti. –

21

Se si dispone di WSDL, è possibile creare un riferimento del servizio in Visual Studio e genererà una classe proxy per l'utente. A meno che non mi manchi un punto preciso nella tua domanda, sarebbe molto più affidabile e molto più facile da implementare e utilizzare.

Spero che questo aiuti.

+2

Infine, una risposta sensata –

+1

-1 per suggerire un riferimento web. –

+0

@ John - potresti elaborare? Modifica: sicuramente non intendi il mio passo falso minore di non usare la terminologia di "Service Reference"? Aggiornerò puntualmente e rimarrò sconcertato sul motivo per cui ciò lo rende una cattiva risposta .. –

Problemi correlati