我正在尝试构建一个REST&基于json的WCF服务,它将复杂类型作为输入。在客户端上,我尝试使用HttpClient来使用此服务,HttpClient是WCF REST Starter Kit的一部分。
以下是我的服务代码:
[WebInvoke(Method = "POST", UriTemplate = "/SendData", BodyStyle = WebMessageBodyStyle.Wrapped)]
public void SendData(List<EditorData> input)
{
//Do something
}
我已经使用了可以在WebMessageBodyStyle枚举中找到的其他选项无效。
这是我在我的客户端使用的复杂类型数据合同:
public class EditorData
{
public string key { get; set; }
public long quesno { get; set; }
public string quescontent { get; set; }
}
客户代码:
List<EditorData> listEditor = new List<EditorData> { new EditorData { key = "key1", quescontent = "qcontent1", quesno = 1},new EditorData { key = "key2", quescontent = "qcontent2", quesno = 2}};
string jsonEditorList = listEditor.ToJSON();
HttpClient client = new HttpClient("http://localhost/RestWcfService/RestService.svc/");
client.DefaultHeaders.Accept.Add("application/json");
HttpResponseMessage response = null;
response = client.Post("SendData", HttpContent.Create(jsonEditorList));
response.EnsureStatusIsSuccessful();
要将我的自定义对象列表转换为json字符串,我使用的是我找到的扩展方法here
当我运行此应用程序时,我收到以下错误:
BadRequest (400) is not one of the following: OK (200), Created (201), Accepted (202), NonAuthoritativeInformation (203), NoContent (204), ResetContent (205), PartialContent (206)
有什么想法吗?
修改
这是fiddler截图:
更新
正如杰森弗雷塔斯所说,我检查了小提琴手的反应。这就是说:
The server encountered an error processing the request. See server logs for more details.
所以我进入IIS日志,这是IIS中记录的错误:
2012-02-15 13:20:08 fe80::ecdd:d2dd:7f70:bef6%11 POST /RestWcfService/RestService.svc/SendData - 80 - fe80::ecdd:d2dd:7f70:bef6%11 - 400 0 0 0
更新2
根据Rajesh的建议,我启用了跟踪我的wcf服务。以下是服务器抛出的异常:
The incoming message has an unexpected message format 'Raw'. The expected message formats for the operation are 'Xml', 'Json'. This can be because a WebContentTypeMapper has not been configured on the binding. See the documentation of WebContentTypeMapper for more details.
当我将内容类型指定为json时,我仍然不明白如何获取Raw格式。
答案 0 :(得分:4)
首先尝试在WCF服务上启用Tracing,以查看400错误请求错误的确切原因。
似乎发布的输入格式错误。您已将EditorData列表定义为方法的参数并发布一些键值对(参考您的fiddler屏幕截图)确保反序列化时fiddler中的json字符串转换为EditorData对象列表。
您还设置了要包裹的身体样式。尝试删除它,看看它是否有效。当您有多个参数时,将使用包装的请求,然后在这种情况下,您将所有参数包装在方法名称元素中并通过网络发送。
更新:
请确保将Content-Type添加到标题中,如下所示:
client.DefaultHeaders.ContentType = "application/json";
答案 1 :(得分:0)
[WebInvoke]
默认为XML序列化。您需要告诉它您正在将数据作为JSON发送。像这样
RequestFormat = WebMessageFormat.Json