【问题标题】:WCF RESTful service not accepting JSON inputWCF RESTful 服务不接受 JSON 输入
【发布时间】:2013-01-24 04:55:35
【问题描述】:

就我而言,我有一个如下的网络服务,

    [OperationContract]
    [WebInvoke(UriTemplate = "services/CreatePerson", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST")]
    string CreatePerson(string data);

它需要一个 JSON 输入。当我通过将 JSON 字符串作为请求正文传递如下的 Fiddler 来测试此服务时,

"{"personName":"Joe", "source":"I", "address":"KK Road"}"

请求标头为

User-Agent: Fiddler
Content-Type: application/json;charset=utf-8
Host: localhost
Content-Length: 54

调试时没有碰到服务方法断点。

同时它适用于以下JSON(将双引号替换为前一个json的单引号),

"{'personName':'102',  'source':'I',  'address':'KK Road'}"

服务方法不接受 JSON 字符串输入,因为如果我将输入作为“测试”传递它会很好..

实际问题在哪里,请帮我找出来....

【问题讨论】:

  • 那么双引号改成单引号后有什么问题呢?如果您传入这样的对象,您也可以将 json 对象直接映射到您的方法参数:{ "data" : "somevalue"}
  • "{'personName':'102', 'source':'I', 'address':'KK Road'}" 输入工作正常,但在消费者处管理此输入却很容易听到和服务方面,因为android和iphone应用程序使用的服务应该通过将双引号替换为单引号来重写代码(作为在将其类序列化为json时使用双引号获取json字符串)并且在服务上我需要替换它用双引号反序列化到相应的类..
  • 好的。那么是否有特定原因需要在单个参数中传递数据?我的意思是对于上面的示例,您可以使用 3 个参数创建服务方法。然后从 iphone 或 android 客户端,您可以创建一个常规对象,将其序列化为 JSON 并将其传递给服务。只要对象具有相同的参数名称,WCF 就会适当地映射它。

标签: c# .net wcf rest fiddler


【解决方案1】:

我认为您不应该使用首引号和尾引号!

试试:

{'personName':'102',  'source':'I',  'address':'KK Road'}

另外你的方法不应该接受一个字符串参数,而是一个符合 json 的类。

 public class M
 {
     public string personName { get; set; }
     public string source { get; set; }
     public string address { get; set; }
 }

 [OperationContract]
 [WebInvoke(UriTemplate = "services/CreatePerson", RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, Method = "POST")]
 string CreatePerson(M data);

【讨论】:

  • 谢谢 Rechard,我也试过了,但仍然没有达到服务方法。如果我将 json 输入作为 {"M":{ "personId":"102", "source":"I", "allergen":"dust"}} 传递,它将命中服务方法,但在服务中M类的属性为null(personId,source,address为null)
  • 我假设您正在从 Fiddler 进行 POST。 Fiddler 报告的响应是什么?
  • 是的。我正在使用实体框架。它已经通过实体生成了一个名为“Person”的类,该类具有我们在 json 输入中定义的所有属性。当我将服务方法的类型更改为“ Person' 并将 json 输入作为 { "personName":"Joe", "source":"I", "address":"KK Road","createdDate":"12/12/2012"} 传递给 null调试时服务方法的相应属性。现在我创建了一个名为“PersonData”的单独类以及之前由实体框架生成的相同属性,它工作得很好......
  • 我们不能直接在服务方法中为特定表使用实体框架工作类吗?我们是否需要创建另一个具有相同属性的类来处理输入?
  • 您可以使用实体框架类,但它们太重而无法序列化。所以我建议为服务创建单独的轻量级类。
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多