错误请求:带入门工具包的WCF REST服务

时间:2012-02-15 06:14:14

标签: wcf wcf-rest wcf-rest-starter-kit

我正在尝试构建一个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截图:

enter image description here

更新

正如杰森弗雷塔斯所说,我检查了小提琴手的反应。这就是说:

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格式。

2 个答案:

答案 0 :(得分:4)

首先尝试在WCF服务上启用Tracing,以查看400错误请求错误的确切原因。

似乎发布的输入格式错误。您已将EditorData列表定义为方法的参数并发布一些键值对(参考您的fiddler屏幕截图)确保反序列化时fiddler中的json字符串转换为EditorData对象列表。

您还设置了要包裹的身体样式。尝试删除它,看看它是否有效。当您有多个参数时,将使用包装的请求,然后在这种情况下,您将所有参数包装在方法名称元素中并通过网络发送。

更新:

请确保将Content-Type添加到标题中,如下所示:

client.DefaultHeaders.ContentType = "application/json";

答案 1 :(得分:0)

[WebInvoke]默认为XML序列化。您需要告诉它您正在将数据作为JSON发送。像这样

在WebInvoke属性中设置RequestFormat

RequestFormat = WebMessageFormat.Json