RESTful Web服务无法从c#获取正确的请求

时间:2014-02-28 00:29:29

标签: c# web-services wcf rest httpclient

我创建了一个c#客户端来使用我的REST Web服务。

我已使用SOAPUI测试了Web服务方法,它可以使用以下请求

POST http://example.com/RestServiceImpl.svc/CallADSWebMethod HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 12
Host: localhost:35798
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

{"test": "2"}

但是我无法从客户端应用程序生成相同的httppost。

ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();       
postParameters.add(new BasicNameValuePair("test", "2"));

HttpClient client = GetHttpClient();
HttpPost request = new HttpPost("http://example.com/RestServiceImpl.svc/CallADSWebMethod");
request.SetHeader("content-type", "application/json");

UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
request.SetEntity(formEntity);

HttpResponse response = client.Execute(request);

我使用svctrace检查服务日志,我看到的错误消息是

  

格式化程序在尝试反序列化消息时抛出异常:反序列化操作“CallADSWebMethod”的请求消息体时出错。遇到意想不到的字符't'。

有没有人知道这个HttpPost请求我哪里出错?

1 个答案:

答案 0 :(得分:1)

UrlEncodedFormEntity没有以JSON格式序列化数据,这正是您想要的。您有几个选择:

  • 使用JavaScriptSerializer作为建议的@minhcat_vo,或任何其他JSON序列化程序,包括DataContractJsonSerializer(恰好是WCF使用的),JSON.NET或任何其他。然后使用序列化字符串tand使用StringEntity。但是,如果以ArrayList<NameValuePair>类开头,则可能无法获得JSON对象。请尝试使用字典。
  • 您还可以使用System.Net.Http.HttpClient类并使用具有相同内容的StringContent对象。
  • 如果你使用System.Net.Http.HttpClient,你也可以使用带有ObjectContentJsonMediaTypeFormatter,它将获取你的对象并使用给定的格式化程序(在你的情况下为JSON)将其序列化。

以下代码显示了一个选项:

var c = new HttpClient();
var req = new HttpRequestMessage(
    HttpMethod.Post,
    "http://example.com/RestServiceImpl.svc/CallADSWebMethod");
var body = new Newtonsoft.Json.Linq.JObject();
body.AddProperty("test", "2");
req.Content = new StringContent(body.ToString(), Encoding.UTF8, "application/json");
var resp = await c.SendAsync(req);