Laden...

REST-Aufruf GETAsync funktioniert, POSTAsync funktioniert nicht

Erstellt von Boris0815 vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.382 Views
B
Boris0815 Themenstarter:in
225 Beiträge seit 2008
vor 9 Jahren
REST-Aufruf GETAsync funktioniert, POSTAsync funktioniert nicht

Hallo,

ich habe einen REST-Service erstellt und einen Windowsclient. Jetzt habe ich allerdings das Problem, dass POST-Anfragen nicht funktionieren.
Bei POST-Anfragen bekomm ich immer eine Fehlermeldung am Clienten, dass der Server die Verbindung geschlossen hat.> Fehlermeldung:

...an-existing-connection-was-forcibly-closed-by-the-remote-host

Ich hab schon etwas gegooglet und heraus gefunden das es wohl einen Bug im Framework 4.0 gab, ich alle Teile auf 4.5.1. geupdated, leider ohne Erfolg.
Der Service läuft auf einem Server mit einem SSL-Zertifikat. Ich habe auch schon probiert den Service ohne SSL zu nutzen, hat allerdings auch nichts geändert.

Hier ein bischen Code vom Server:

        public WebServiceHost horst = new WebServiceHost(typeof(meinServiceImpl));
        //private string url = "https://meinserver:29999/meinService";
        private string url = "http://meinserver:29999/meinService";

        public void StartService() 
        {
            WebHttpBinding binding = new WebHttpBinding();
            //binding.Security.Mode = WebHttpSecurityMode.Transport;
            horst.AddServiceEndpoint(typeof(ImeinService), binding, url);
            horst.Open();
        }

Und die Post und Get Methoden (generisch)

       public T Get<T>(string path)
        {
            var response = client.GetAsync(baseUri+path).Result;
            if (response.IsSuccessStatusCode&& response.Content.Headers.ContentLength > 0)
            {
                return this.ParseResponse<T>( response.Content.ReadAsStringAsync().Result);
            }
            return default(T);
        }

        public T Post<T, U>(string path, U postdata)
        {
            DataContractJsonSerializer dJson = new DataContractJsonSerializer(typeof(U));
            var ms = new MemoryStream();
            dJson.WriteObject(ms, postdata);
            string s = Encoding.UTF8.GetString(ms.ToArray());
            StringContent content = new StringContent(s, Encoding.UTF8, mediatypeStr); 

            var response = client.PostAsync(baseUri+path, content).Result;
            if (response.IsSuccessStatusCode && response.Content.Headers.ContentLength > 0)
            {
                return this.ParseResponse<T>(response.Content.ReadAsStringAsync().Result);
            }
            return default(T);
        }

Hat jemand eine Idee für mich?

Gruß
Boris

16.835 Beiträge seit 2008
vor 9 Jahren

Ein RESTful-Service hat feste Vorgaben, welche Übertragungswege verwendet werden.
Könnte daran liegen, dass diese evtl. nicht eingehalten werden. Ich weiß, dass das bei einem OData-unterstützenden Webservice Probleme machen kann.

Eigentlich...* Das Holen von Elementen erfolgt über GET

  • Das Speichern von NEUEN Elementen erfolgt über PUT
  • Das Speichern von VORHANDEN Elementen (also das Ändern) erfolgt über PATCH
  • Das Löschen erfolgt über DELETE

_Aber.. _es gibt auch* Das Holen von Elementen erfolgt über GET *:::

*:::

*Das Löschen erfolgt über DELETE

Standardmäßig erlaubt aber zumindest der IIS die HTTP Methoden (HTTP Verbs) PUT, PATCH und DELETE nicht.
Die musst Du erst aktivieren - je nach IIS Version über die Web.Config für die jeweiligen Instanzen möglich.

B
Boris0815 Themenstarter:in
225 Beiträge seit 2008
vor 9 Jahren

Hallo,

ich hoste den Service in einer Windows-Anwendung nicht im IIS.
An welcher Stelle müsste ich dann schauen, um es zu aktivieren?

Gruß

Boris

16.835 Beiträge seit 2008
vor 9 Jahren

SelfHosted filtern nicht; dann kannst meinen Beitrag vergessen 😉

Aktivier mal Dein WCF Tracing (also System.Diagnostic über die Config).
Es könnte durchaus sein, dass sich bei beiden Endpunkten die Maximallänge eines Requests unterscheidet; das würde die Fehlermeldung erklären: POST Header sind viel länger als GET Header. Beim Überschreiten des Limits gibt die von Dir genannte Meldung.

Grund könnte zum Beispiel sein, dass Du zwei verschiedene BaseServices nutzt. Microsoft hat zB. (für gewisse Teile, zB ODATA) die Namespaces vonSystem.Data.Servicesauf Microsoft.Data.Services geändert und dahingehend auch Defaults.
Oder Deine Configs haben schon verschiedene Werte von Haus aus.

Wenn es das nicht ist, dann gib Bescheid, dann suchen wir weiter.

B
Boris0815 Themenstarter:in
225 Beiträge seit 2008
vor 9 Jahren

Das mit dem Tracen von WCF hab ich zuvor noch nicht gemacht, aber ein cooles feature. 8)
Ich werde es mir heut Abend mal genauer anschauen und melde mich.

Gruß
Boris

B
Boris0815 Themenstarter:in
225 Beiträge seit 2008
vor 9 Jahren

Habs. 😃

Ich hatte eine DateTime nicht gesetzt, daher der Fehler.

DateTime values that are greater than DateTime.MaxValue or smaller than DateTime.MinValue when converted to UTC cannot be serialized to JSON.

Das WCF-Tracing ist einfach nur genial, damit hast Du mir garantiert schon jetzt in der Zukunft geholfen. 😃

Vielen Dank für den Tip!

Gruß

Boris