2009-02-22 8 views
17

Ich versuche, eine POST-Anfrage an einen einfachen WCF-Dienst zu senden, den ich geschrieben habe, aber ich bekomme immer eine 400 Bad Request. Ich versuche, JSON-Daten an den Dienst zu senden. Kann jemand sehen, was ich falsch mache? :-)Warum gibt mein C# -Client, der an meinen WCF-REST-Dienst sendet, (400) eine ungültige Anforderung zurück?

Das ist meine Service-Schnittstelle:

public interface Itestservice 
{ 
    [OperationContract] 
    [WebInvoke(
     Method = "POST", 
     UriTemplate = "/create", 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json)] 
    String Create(TestData testData); 
} 

Die Umsetzung:

public class testservice: Itestservice 
{ 
    public String Create(TestData testData) 
    { 
     return "Hello, your test data is " + testData.SomeData; 
    } 
} 

Die Datacontract:

[DataContract] 
public class TestData 
{ 
    [DataMember] 
    public String SomeData { get; set; } 
} 

Und mein Client-Code schließlich:

private static void TestCreatePost() 
{ 
    Console.WriteLine("testservice.svc/create POST:"); 
    Console.WriteLine("-----------------------"); 

    Uri address = new Uri("http://localhost:" + PORT + "/testweb/testservice.svc/create"); 

    // Create the web request 
    HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; 

    // Set type to POST 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    //request.ContentType = "text/x-json"; 

    // Create the data we want to send 
    string data = "{\"SomeData\":\"someTestData\"}"; 

    // Create a byte array of the data we want to send 
    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); 

    // Set the content length in the request headers 
    request.ContentLength = byteData.Length; 

    // Write data 
    using (Stream postStream = request.GetRequestStream()) 
    { 
     postStream.Write(byteData, 0, byteData.Length); 
    } 

    // Get response 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     // Get the response stream 
     StreamReader reader = new StreamReader(response.GetResponseStream()); 

     // Console application output 
     Console.WriteLine(reader.ReadToEnd()); 
    } 

    Console.WriteLine(); 
    Console.WriteLine(); 
} 

Kann jemand darüber nachdenken, was ich falsch machen könnte? Wie Sie im C# -Client sehen können, habe ich sowohl application/x-www-form-urlencoded als auch text/x-json für ContentType ausprobiert, weil ich dachte, dass das etwas damit zu tun haben könnte, aber anscheinend nicht. Ich habe versucht, eine GET-Version des gleichen Dienstes und es funktioniert gut und gibt eine JSON-Version von TestData ohne Probleme zurück. Aber für POST, na ja, ich bin ziemlich im Moment auf diesem :-(stecken

+0

können Sie http-Protokolle (Client und/oder Server) liefern? – defeated

Antwort

8

Haben Sie "application/json" anstelle von "text/x-json" versucht. nach this Stack-Überlauf Frage application/json ist der einzige gültige json Medientyp.

+0

Das war es, danke :-) –

0

Versuchen:

[OperationContract] 
[WebInvoke(
    Method = "POST", 
    UriTemplate = "/create", 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, 
    /* non-wrapped */ BodyStyle = WebMessageBodyStyle.Bare)] 
String Create(TestData testData); 
+0

es braucht nur einen Parameter. ist es wirklich wichtig, ob es verpackt ist oder nicht? In diesem Fall lehnt der Server die Anfrage ab, weil der contentType in der Anfrage nicht erwünscht ist. –

+0

ja der contentType ist auch falsch. Aber ich hatte dieses Problem selbst und ich war mir ziemlich sicher, dass es der BodyStyle war, der das verursachte. – baretta

4

das einzige Problem hier ist der Content.

Versuch (empfohlen)

request.ContentType = "application/json; charset=utf-8"; 

oder (dies wird auch funktionieren)

request.ContentType = "text/json; charset=utf-8"; 

Beide oben lösen das Problem. Allerdings ist die erste empfohlen, für Details von JSON-RPC 1.1 Spezifikation überprüfen http://json-rpc.org

Verwandte Themen