为什么我的C#客户端,POST到我的WCF REST服务,返回(400)错误请求?

我正在尝试向我写的一个简单的WCF服务发送POST请求,但我一直收到400 Bad Request。 我正在尝试将JSON数据发送到服务。 谁能发现我做错了什么? 🙂

这是我的服务界面:

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

实施:

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

DataContract:

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

最后我的客户端代码:

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

谁能想到我可能做错了什么? 正如你在C#客户端中看到的那样,我已经尝试了applicationType / x-www-form-urlencoded和text / x-json for ContentType,认为可能与它有关,但似乎没有。 我已经尝试过这个相同服务的GET版本并且工作正常,并且返回JSON版本的TestData没有问题。 但对于POST,嗯,我现在相当坚持这个:-(

你有没有试过“application / json”而不是“text / x-json”。 根据此 Stack Overflow问题,应用程序/ json是唯一有效的json媒体类型。

这里唯一的问题是ContentType。

尝试(推荐)

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

或(这也会起作用)

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

以上都解决了这个问题。 但是,建议使用第一个,有关JSON-RPC 1.1规范的详细信息,请查看http://json-rpc.org

尝试:

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