Why does my C# client, POSTing to my WCF REST service, return (400) Bad Request?

27,099

Solution 1

Have you tried "application/json" instead of "text/x-json". According to this Stack Overflow question application/json is the only valid json media type.

Solution 2

The only problem here is the ContentType.

try ( recommended )

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

or ( this will work too )

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

Both of above solve the problem. However, the first one is recommended, for details of JSON-RPC 1.1 Specification check out http://json-rpc.org

Share:
27,099
Rob
Author by

Rob

Software architect specializing in machine learning/AI. Enjoys Python/TensorFlow/PyTorch/CNTK.

Updated on August 01, 2022

Comments

  • Rob
    Rob almost 2 years

    I'm trying to send a POST request to a simple WCF service I wrote, but I keep getting a 400 Bad Request. I'm trying to send JSON data to the service. Can anyone spot what I'm doing wrong? :-)

    This is my service interface:

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

    The implementation:

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

    The DataContract:

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

    And finally my client code:

    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();
    }
    

    Can anyone think of what I might be doing wrong? As you can see in the C# client I've tried both application/x-www-form-urlencoded and text/x-json for ContentType, thinking that might have something to do with it, but it doesn't seem to. I've tried a GET version of this same service and it works fine, and returns a JSON version of TestData with no problem. But for POST, well, I'm pretty stuck at the moment on this :-(