2013-01-24 199 views
2

在我的情况WCF RESTful服务,我有如下一个Web服务,不接受JSON输入

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

它期待一个JSON输入。虽然我通过传递一个JSON字符串作为请求的身体下面,

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

测试使用Fiddler此服务,并请求头作为

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字符串输入,因为它工作得很好,如果我通过输入如“测试” ..

哪里是实际的问题,请帮我找出....

+0

那么,将双引号更改为单引号后会出现什么问题?你也可以直接将json对象映射到你的方法参数,如果你传入这样一个对象:{“data”:“somevalue”} – Jomit

+0

“{'personName':'102','source':'I','地址':'KK Road'}“输入正在工作,但是在消费者和服务端管理这个输入相当无礼,因为android和iphone应用程序所使用的服务应该通过将双引号替换为单引号来重写代码(如获取json字符串时,使用双引号将他们的类序列化为json)以及我需要将其替换为双引号以反序列化到相应类的服务。 –

+0

好的。那么为什么你需要在一个参数中传递数据呢?我的意思是对于上面的例子,你可以用3个参数创建服务方法。然后从iPhone或Android客户端,您可以创建一个常规对象,将其序列化为JSON并将其传递给服务。只要对象具有相同的参数名称,WCF就会适当地映射它。 – Jomit

回答

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); 
+0

谢谢Rechard,我也尝试过,但它仍然没有达到服务方法。如果我将json输入作为{“M”:{“personId”:“102”,“source”:“I”,“allergen”:“dust”}}传递给服务方法,但是在服务中全部M类的属性为null(personId,source,address为null) –

+0

我假设你正在从Fiddler开始POST。 Fiddler报告的回应是什么? –

+0

是的,我正在使用实体框架。它已经生成了一个名为'Person'的实体,它具有我们在json输入中定义的所有属性。当我将服务方法的类型更改为'Person'并传递json输入as {“personName”:“Joe”,“source”:“I”,“address”:“KK Road”,“createdDate”:“2012年12月12日”}在服务方法中,调试。现在我已经创建了一个名为'PersonData'的单独的类以及由实体框架生成的相同属性,它的工作完美无缺... –