Laden...

Zu Java Webservice verbinden und Methoden aufrufen

Erstellt von zipperle vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.068 Views
Z
zipperle Themenstarter:in
47 Beiträge seit 2006
vor 12 Jahren
Zu Java Webservice verbinden und Methoden aufrufen

Ich komme einfach nicht klar und benötige Eure Hilfe 😦

Habe zwei Probleme, aber kurz zur Ausgangssituation:
Ich habe eine Konsolenapplikation erstellt. Habe eine WSDL als Datei vorliegen und mit Add Service Reference eingebunden.

Problem 1: https Verbindung aufbauen:
Das scheitert beim Aufruf von


WebResponse webResponse = httpWebRequest.GetResponse();  

mit der Execption: System.Net.WebException: Die Anfrage wurde abgebrochen: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden.

laut Google sollte folgender Code Abhilfe schaffen:


ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return (true); };

aber leider springt er nicht mal in den delegate handler (habe diese inline zeile mit dem delegate auch schon als methode ausprogrammiert und haltepunkt gesetzt,aber da springt er nicht rein, d.h. es kommt nich mal zur Zertifikat Überprüfung)

Problem 2: wie ruft man dann die methoden des Webservices auf? Dazu kann ich die Klassen der WSDL als Objekte anlegen, aber wie kommt es nun zum Aufruf des Service? Bin aus google nicht schlau geworden wie die aus der WSDL erstellten Typen verwenden kann? Muss man die irgendwie in ein Xml Dokument packen und dann einen neuen httpwebrequest verpacken?
Ein Code Beispiel was ich meine:


QcsiWsdl.helloWorldRequest helloWorldRequest = new helloWorldRequest();
QcsiWsdl.helloWorldResponse helloWorlResponse = new helloWorldResponse();

Methoden gibt es keine auf den beiden Objekten. Ich verstehs nicht was mir die Objekte bringen.
Mit dem Tool SoapUI, sieht man den XmlRequest umhüllt in Envelops und dazu als Antwort gültiges XmlResponse mit helloworld Inhalt umhüllt in Envelopes Elementen.

Als Zusatzinfos es handelt sich um einen Java Webservice auf den ich keinen Einfluss habe.
Des Weiteren der Webservice hat zwei Adressen, eine ungesicherte http Adresse, über die ich mir die WSDL holen konnte,als Datei abgespeichert und als Service Referenz hinzugefügt. Die zweite Adresse ist eine gesicherte https Adresse, diese scheint wohl nur für die WebService Kommunikation da zu sein (und späteren Produktivbetrieb), hier erhält man nicht die wsdl wenn man die adresse im browser eingibt. Oder müsste man diese im Browser sehen wenn man das Zertifikat installiert?

Hier noch mein kompletter Code den ich zum Verbindungsaufbau verwende:


ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
            ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return (true); };
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(Settings.Default.WebServiceUrl);
            mVerifyCert = new X509Certificate2(Settings.Default.CertificateFileNameFull);
            httpWebRequest.ClientCertificates.Add(mVerifyCert);
            WebResponse webResponse = httpWebRequest.GetResponse();

Und hier das Request Dokument für hello world was mir soapUI anzeigt


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bci="http://xyz.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <bci:helloWorld/>
   </soapenv:Body>
</soapenv:Envelope>

und der response dazu:


<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:helloWorldResponse xmlns:ns2="http://xyz.com/">
         <return>Hello World</return>
      </ns2:helloWorldResponse>
   </S:Body>
</S:Envelope>

Z
zipperle Themenstarter:in
47 Beiträge seit 2006
vor 12 Jahren

update: Problem 2 habe ich mittlerweile nach weiterem einlesen in webservices und soap verstanden und weis nun wie ich die klassen aus der wsdl verwenden kann. ich muss die klasse instanziieren die den service representiert, dort werden dann alle methoden angeobten, code habe ich wie folgt geändert.


ServicePointManager.Expect100Continue = ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
ServicePointManager.ServerCertificateValidationCallback =
                ((sender, certificate, chain, sslPolicyErrors) => true);

QcsiWebService.WSAdapterBCIClient webService = new QcsiWebService.WSAdapterBCIClient();
string response = webService.helloWorld();
Console.WriteLine(string.Format("Result of hello world requuest: {0}", response));

Mit diesem Code kommt es nicht mehr zur gleichen Exception wie bei Problem 1 beschrieben, dafür kommt es zu einer ähnlichen Exception:

System.ServiceModel.Security.SecurityNegotiationException: Es konnte kein sicherer Kanal für SSL/TLS mit Autorität "xyz.com" eingerichtet werden. ---> System.Net.WebException: Die Anfrage wurde abgebrochen: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden.

Ich habe ein srt zertifikat, dass wird u.a. auf der serverseite dafür benötigt, um einen gewissen datenbestand für den webservice freizuschalten (jeder kunde erhält also ein anderes zertifikat).
Aber wie ich dieses Zertifikat in dem oben dargestellten Code einbauen kann habe ich nicht herausgefunden.

Mit diesem Code hier kann man ein Zertifikat angeben:


((HttpWebRequest)httpWebRequest).ClientCertificates.Add(mVerifyCert);

Aber eigtl brauche ich doch keine expliziten http requests mehr, da ich ja meine service instanz siehe code oben habe.