2

我正在尝试构建一个以复杂类型作为输入的基于 REST 和 json 的 WCF 服务。在客户端上,我尝试使用作为 WCF REST Starter Kit 一部分的 HttpClient 来使用此服务。

以下是我的服务代码:

[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 字符串,我使用的是在这里找到的扩展方法

当我运行此应用程序时,我收到以下错误:

BadRequest (400) is not one of the following: OK (200), Created (201), Accepted (202), NonAuthoritativeInformation (203), NoContent (204), ResetContent (205), PartialContent (206)

有什么想法吗?

编辑:

这是提琴手的屏幕截图:

在此处输入图像描述

更新:

正如 Jason Freitas 所建议的,我检查了提琴手中的响应。这就是说:

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 时,我仍然不明白它是如何获取原始格式的。

4

2 回答 2

4

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

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

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

更新:

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

client.DefaultHeaders.ContentType = "application/json";
于 2012-02-15T09:51:42.707 回答
0

[WebInvoke]默认为 XML 序列化。您需要告诉它您正在以 JSON 格式发送数据。像这样在 WebInvoke 属性中设置 RequestFormat

RequestFormat = WebMessageFormat.Json

于 2012-02-15T08:50:33.827 回答