2010-07-26 8 views
10

Ich habe eine SOAP-WSDL (hier gefunden: https://portal.bsh-partner.com/picenter/server/a2a/) und ich versuche, die Web-Services zu konsumieren.Consuming SOAP-Web-Service 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; 

Die Antwort gibt eine allgemeine HTTP-Antwortfehlerseite zurück. Irgendeine Idee, wie ich meinen Soap Envelope weiterleiten sollte, um die richtige Antwort vom Webservice zurückzubekommen?

+3

Warum in der Welt sind Sie Hand eine Seife Nachricht basteln? –

+2

Idk, wenn ich das upvote, weil es so ein großartiges Beispiel ist, es falsch zu machen oder es aus dem gleichen Grund downvote ... –

Antwort

9

Ich habe gerade festgestellt, dass Sie diesen Code auf der Serverseite verwenden.


Dies ist nicht die Art, Web-Services in .NET zu konsumieren. Verwenden Sie den Befehl "Add Service Reference" in Visual Studio, um Proxy-Klassen zu erstellen, mit denen Sie den Dienst sehr einfach verwenden können.

Siehe How to Consume a Web Service für ein Beispiel, sowie http://msdn.microsoft.com/wcf/.

Auch nie verwenden Sie String-Manipulationstechniken bei der Arbeit mit XML. Kurz gesagt, die Regeln für Strings und für XML sind unterschiedlich. .NET verfügt über mehrere XML-APIs, um mit XML zu arbeiten, und alle kennen die Regeln.

+0

Was meinst du mit "Es ist normalerweise besser, einen SOAP-Dienst von der Server-Seite zu konsumieren. Es ist viel einfacher . " ? –

+0

@Allen: bis ich "' string.Empty' "bemerkte, dachte ich, das war JavaScript. –

+0

ahhh, das macht Sinn –

3

einfach auf den Code Blick sieht es aus wie vergessen Sie Ihren Körper Starttag hinzuzufügen: <soapenv:Body>

Sofern Sie einen besonderen Grund Ihrer Nachricht manuell sein konstruieren, würde ich empfehlen einen Proxy unter Verwendung der erzeugten mit svcutil.exe-Tool, das mit Visual Studio 2008 oder später kommt. (Dieses Tool wird von Visual Studio automatisch verwendet, wenn Sie die Funktion "Add Service Reference" verwenden), vorausgesetzt, Sie haben kein Problem damit, WCF für die Kommunikation mit Ihrem Webdienst zu verwenden.

Alternativ, wenn Sie aus irgendeinem Grund WCF nicht verwenden können, wie wenn Sie in .Net 2.0 mit Visual Studio 2005 entwickeln, in welchem ​​Fall Sie nicht die "Add Service Reference" -Funktion verfügbar wäre, dann könnte Verwenden Sie weiterhin die ältere Funktion "Web-Referenz hinzufügen" von Visual Studio, um einen Proxy für Ihren Web-Service zu generieren. Diese Funktion verwendet das Tool wsdl.exe anstelle von svcutil.exe.

Andernfalls, wenn Sie wirklich mit diesem Ansatz der Erstellung der SOAP-Nachricht manuell fortfahren müssen, würde ich zumindest empfehlen, einige Protokollierung zu Ihrer Anwendung hinzufügen, so dass Sie die konstruierte Nachricht einfacher analysieren können, wenn etwas schief geht.

+0

(gelöscht mein vorheriger Kommentar aufgrund der Tatsache, dass inkorrekt falsch) Ich stimme zu Ihrem Punkt; An dieser Stelle sollte WCF der empfohlene Ansatz sein, falls verfügbar. Beachten Sie, dass eine Anzahl der Links auf MSDN unter VS2010 ASP.NET-Webdienste (http://msdn.microsoft.com/en-us/library/yzbxwf53.aspx) speziell erwähnen, dass die Funktion "Web Reference"/wsdl.exe ist alt und wird aus Gründen der Abwärtskompatibilität bereitgestellt. –

21

Wenn Sie über WSDL verfügen, können Sie in Visual Studio eine Service-Referenz erstellen und eine Proxy-Klasse für Sie generieren. Es sei denn, ich verpasse einen guten Punkt in Ihrer Frage, es wäre viel zuverlässiger und viel einfacher zu implementieren und zu verwenden.

Hoffe, dass hilft.

+2

Schließlich eine vernünftige Antwort –

+1

-1 für eine Web-Referenz vorschlagen. –

+0

@John - könnten Sie das ausarbeiten? Edit: Sicher meinst du nicht meinen kleinen Fehler, die Terminologie der 'Service Reference' nicht zu benutzen? Ich werde ordnungsgemäß aktualisieren und verwirrt bleiben, warum das eine schlechte Antwort macht. –

Verwandte Themen