Zum Inhalt springen
  • 0

C# Hilfe mit POST and WebServer


Tician

Frage

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 von Tician
Link zu diesem Kommentar
Auf anderen Seiten teilen

19 Antworten auf diese Frage

Empfohlene Beiträge

  • 1

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 von DevCouch
typo
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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 von Tician
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
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 von Tician
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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>

Unbenannt.PNG.afcabb1da3f8e386bb6fac1e4279b2fb.PNG

Theoretisch würde ich jetzt mal ausprobieren:

Execute("Label:Print", "<![CDATA[<?xml version=....>")

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
		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:

Unbenannt.PNG.2d8a18cd85014d12b4d2bdf0ba0aad59.PNG

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 von Tician
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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:

Unbenannt.thumb.PNG.c3d16d603a53c46d6a44217212ea0a1a.PNG

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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 von Tician
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
<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 von Tician
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...