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
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
_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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.Services
auf 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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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