Veröffentlicht 10. April 20196 j Hallöööchen mit 3 öchen, nach langer Zeit mal wieder ich^^ Ich versuche Text im xml-format an einen WebServer zu schicken. Nutze ich dafür SoapUI funktioniert alles einwandfrei und ich bekomme eine xml-Datei zurück. Versuche ich es in C# krieg ich entweder Fehlermeldungen an den Kopf geworfen oder... nichts. Nach langem rumprobieren mit dem veralteten WebRequest hab ich immer nur einen 'Internal Server-Error' zurück bekommen, also hab ich mich doch auf das neuere HttpClient eingelassen. Code sieht momentan so aus: static async Task<string> PostURI(Uri u, HttpContent c) { var response = string.Empty; using (var client = new HttpClient()) { HttpResponseMessage result = await client.PostAsync(u, c); if (result.IsSuccessStatusCode) { response = result.StatusCode.ToString(); } } return response; } //Aufgerufen: Uri u = new Uri("http://unserServer:8080/WorkflowInterface"); HttpContent c = new StringContent(xml, Encoding.UTF8, "text/xml"); var t = Task.Run(() => PostURI(u, c)); t.Wait(); MessageBox.Show(t.Result); Meine MessageBox von der ich hoffte dass sie mir testweise die xml-Antwort anzeigen würde ist komplett leer und nachdem ich gestern schon den ganzen Tag rumprobiert habe bin ich einfach nur durch, ich finde keine Lösungen. User und Passwort gibt es nicht. xml ist einfach nur eine string-variable. Ich hoffe dass mir jemand etwas unter die Arme greifen könnte. Tician Edit: OK, ich krieg nix zurück weil result nicht successful ist, es steht wieder 'Internal server Error' drin, mit dem kann ich einfach nichts anfangen Bearbeitet 10. April 20196 j von Tician
10. April 20196 j Verwendest du einen Proxy auf dem Rechner, den du evtl. noch konfigurieren musst im HttpClient? Ansonsten hilft ggf. das Nachschauen in den Server-Logs oder das Tracen des entsprechenden Web-Requests und Vergleich mit dem durch SoapUI gestellten Request.
10. April 20196 j Autor Kein Proxy und auf dem Server haben wir zwar Logs gefunden für die 'korrekten' Anfragen, aber di ezeigen nichts wenn mein Programm auf einen Fehler rennt. Im Programm selbst wird auch in der Variable result nichts angezeogt außer 'Internal Server Error'. Ich bin eben mal mit Wireshark an die Sache ran und das gibt ein bisschen mehr Auskunft im Päckchen^^: Zitat <faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none"> a:ActionNotSupported </faultcode> Die Nachricht mit Action "" kann aufgrund einer fehlenden ContractFilter-Übereinstimmung beim EndpointDispatcher nicht verarbeitet werden. Mögliche Ursachen: Vertragskonflikt (keine Action-Übereinstimmung zwischen Sender und Empfänger) oder ein Bindung/Sicherheit-Konflikt zwischen dem Sender und dem Empfänger. Stellen Sie sicher, dass Sender und Empfänger über den gleichen Vertrag und die gleiche Bindung verfügen (einschließlich Sicherheitsanforderungen, z. B. "Message", "Transport", "None"). Ich weiß ehrlich gesagt nicht was mit Action überhaupt gemeint ist... Bearbeitet 10. April 20196 j von Tician
10. April 20196 j Evlt application/text? https://stackoverflow.com/questions/4832357/whats-the-difference-between-text-xml-vs-application-xml-for-webservice-respons Bearbeitet 10. April 20196 j von KeeperOfCoffee Fehler
10. April 20196 j Autor Zitat Name Wert Typ ▶ result {StatusCode: 415, ReasonPhrase: 'Cannot process the message because the content type 'application/xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Date: Wed, 10 Apr 2019 11:10:05 GMT Server: Microsoft-HTTPAPI/2.0 Content-Length: 0 }} System.Net.Http.HttpResponseMessage Ich bleib wohl bei text/xml^^ Ich weiß es ehrlich egsagt nich @D-eath es gibt keine Doku, alles was ich weiß ist wie die xml auszusehen hat die ich sende und Uri. Ich kann aber mal schauen ob ich es auf ein GET umgebogen krieg. Edit: Wohl nicht, das SoapUI schickt auch via POST Bearbeitet 10. April 20196 j von Tician
10. April 20196 j Autor Das hätte so nie funktionieren können. Mein Kollege hat mir offenbart es gibt ein msdl (noch nie vorher gehört), das habe ich jetzt als Connected Service in meinem Projekt, aber da ich das das erste mal mache bin ich gerade etwas aufgeschmissen, ich hab keine Doku, weiß nicht was ich machen muss, hab grad verzweifelt gesucht wie die Klasse überhaupt heißt und ein Objekt davon erstellt, aber weiter komme ich nicht, mir werden keine Methoden für mein Objekt angezeigt die irgendwie Sinn machen.
11. April 20196 j Autor Japp. Wie gesagt hab es jetzt als connected Service in mein Projekt eingefügt und auch ein Objekt erstellt das eine 'Execute'-Methode mit 2 Parametern hat die auch als Nodes in der XML vorhanden sind die ich via SoapUI an den Server schicke. Ich bin mir jetzt nur nicht ganz sicher wie es ohne die komplette XML aussehen muss. <wor:command>Label:Print</wor:command> scheint mir noch recht eindeutig zu sein, Parameter als string wäre vermutlich "Label:Print". Aber dann kommt eine Node mit mehreren 'Unter-Nodes' und ich bin mir nicht sicher wie das jetzt aussehen muss, die sieht nämlich etwa so aus: <wor:serializedWorkItem><![CDATA[<?xml version=""1.0""?> <workitem> <MehrZeug=""true""> <nochMehrZeug>blabla</nochMehrZeug> Theoretisch würde ich jetzt mal ausprobieren: Execute("Label:Print", "<![CDATA[<?xml version=....>")
11. April 20196 j Autor ServiceDing.ExecutorClient client = new ServiceDing.ExecutorClient(); client.Endpoint.Address = new System.ServiceModel.EndpointAddress(new Uri("http://unserServer:8080/WorkflowInterface")); client.ExecuteWithLog("Label:Print", serializedWorkItem); client.Close(); Ich versuch die Ziel-Adresse zu überschreiben, bekomme aber den Fehler dass mehr als eine Endpunktkonfiguration für diesen vertrag gefunden wurde. Was fehlt mir? Edit: Ich hab das hier gefunden: Ich muss den also schon beim erstellen des Object angeben, allerdings ist das ein String und ich hab keine Ahnung was mit dem ConfigurationName gemeint ist... Bearbeitet 11. April 20196 j von Tician
11. April 20196 j Hast du den kein Binding? https://docs.microsoft.com/de-de/dotnet/framework/wcf/how-to-specify-a-client-binding-in-code Edit endpointConfigurationName ist normalerweise einfach die Name-Property deines Endpoints Bearbeitet 11. April 20196 j von KeeperOfCoffee
11. April 20196 j Autor Wie bekomme ich das svcutil.exe? Der Ordner den Microsoft beschreibt existiert bei mir nicht.
11. April 20196 j Das brauchst du nicht mehr. ConnectedService hat VS dir das WSDL abgerufen und daraus einen Client-Proxy erstellt und einen Haufen Bindings und Code erstellt. Der Service bietet dir mehrere Execute-Methoden an und du musst jetzt vom Entwickler deines Servers oder aus seiner Doku erfahren was du wohin senden musst. Oder du suchst die Execute-Methode im Source des Servers und schaust mal was die macht. Bearbeitet 11. April 20196 j von DevCouch typo
11. April 20196 j Autor Dann stimmt ja doch alles. Ich hab es mal probiert (Die Execute-Methode) ohne dass ich etwas veränder, aber die Fehlermeldung dass es mehr als eine EndpointKonfiguration gibt bleibt. Der Hersteller bietet zwar die Schnittstellen an, aber es gibt weder eine Doku, noch eine Unterstützung dafür. Alles was ich habe ist diese Seite wenn ich meine Ziel-Adresse direkt in den Browser eingebe: Den Pfad zur WSDL hab ich ja als Connected Service hinzugefügt und hab ja auch die Klasse und alles zur Verfügung. Im Prinzip genau diesen Beispielcode als 3-Zeiler mit einer Execute-Methode drin.
11. April 20196 j Hast du eine Konfigurationsdatei in deiner Anwendung? Wenn ja, müsstest du da die möglichen Client Endpoints sehen und im Konstruktor deines ExecutorClients einen davon angeben.
12. April 20196 j Autor Ich weiß nicht wie so eine Konfigurationsdatei aussehen soll. Ich hab viel XML-Zeug, aber wenn soapUI automatisiert anfragen ausführen kann nur mit der wsdl-datei, dann kann es doch nirgendwo anders stehen oder? In der WSDL steht hier ein einziges mal die Adresse die auch SoapUI automatisch als Endpoint benutzt: - <wsdl:service name="Executor"> - <wsdl:port name="BasicHttpBinding_Executor" binding="i0:BasicHttpBinding_Executor"> <soap:address location="http://UnserServer:8080/WorkflowInterface" /> </wsdl:port> </wsdl:service> Krieg ich die benannte Konfigurationsdatei auch irgendwie direkt vom server? Ich find keine Möglichkeit diese svcutil.exe irgendwie installiert zu bekommen~ Bearbeitet 12. April 20196 j von Tician
12. April 20196 j Die Konfigurationsdatei muss natürlich in deinem Projekt liegen (App.config o. Ä.). Diese hat offensichtlich eine mehrdeutige Endpointkonfiguration, die von deinem Client nicht eindeutig aufgelöst werden kann, weswegen du Entscheidungshilfe leisten musst. Das hat mit der svcutil erst mal nichts zu tun, sondern sind nur Projekteinstellungen. Woher soll dein Client auch wissen, mit wem er sich verbinden soll?
12. April 20196 j Autor <client> <endpoint address="http://UnserServer:8080/WorkflowInterface" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Executor" contract="VExecutor.Executor" name="BasicHttpBinding_Executor" /> <endpoint address="http://UnserServer:8080/WorkflowInterface" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Executor" contract="VExecutor.Executor" name="BasicHttpBinding_Executor1" /> </client> Nur ein AUsschnitt, aber es sagt alles, ich musste erstmal darauf kommen, dass das da drin steht. Ich hab die eine Zeile raus geschmissen und jetzt funktioniert es. Jetzt muss ich nur noch rausfinden wie Execute funktioniert... hinsenden ist nicht das Problem, aber ich seh keine FUnktion um die xml aufzufangen die zurück kommen sollte~ Bearbeitet 12. April 20196 j von Tician
12. April 20196 j Du solltest doch ganz einfach die Methoden aus deiner WSDL auch als Klassenmethoden auf deinem Client haben. Dazu ist die WSDL doch da, um unter anderem die Schnittstelle deines Webservice zu beschreiben. Der Client hat dann die entsprechenden Methoden, die du benötigst, um mit dem WS zu kommunizieren. Das svcutil-Tool erhältst du, indem du das Windows SDK installierst. Entweder über den VS Installer oder https://developer.microsoft.com/de-de/windows/downloads/windows-10-sdk
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.