将JSON传递给Web.API可以与Fiddler一起使用,但不能在代码中使用

时间:2015-04-19 13:05:00

标签: c# json asp.net-web-api

我正在尝试将我的JSON传递给Web.API服务。当我设置为POST并且我在[FromBody ]参数内得到值时,发送与Fiddler配合得很好:

Http/1.1
User-Agent: Fiddler
content-type: application/json; charset=utf-8
Host: http://localhost:27701/api/myList
Content-Length: 883

但是当我使用这个C#代码发布JSON时,[FromBody ]参数为空:

HttpContent content = new StringContent(data);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:27701/api/");
HttpResponseMessage response = client.PostAsync("myList", content).Result;

if (response.IsSuccessStatusCode)
{
    var result = response.Content.ReadAsAsync<string>().Result;
    s = result;
}

数据部分是Fiddler和我的代码中的确切JSON,并且两个调用都调用了控制器。

这是我的JSON:

{  
  "Id":0,
  "Count":0,
  "StartDate":"\\/Date(-62135596800000)\\/",
  "Address":{  
    "Id":0,
    "State":"test",
    "City":"test"
  }
}

有一件事是,如果我不在fiddler中的字符串的两边放'(单引号),[FromBody]参数为空,但如果我把它们放在C#sample上,则响应为500服务器错误。

1 个答案:

答案 0 :(得分:2)

您尚未发布接收方法代码,但根据提供的数据,它应该是一个带有一个参数的方法,该参数是代表您的JSON的对象。在这种情况下,您根本不需要使用FromBody属性。

如果您查看article,可以找到:

  

默认情况下,Web API使用以下规则绑定参数:

     
      
  • 如果参数是“简单”类型,Web API会尝试从URI获取值。简单类型包括.NET基元类型(int,
      bool,double等等,加上TimeSpan,DateTime,Guid,decimal,
      和字符串,以及具有可转换的类型转换器的任何类型   一个字符串。
  •   
  • 对于复杂类型,Web API尝试使用媒体类型格式化程序从邮件正文中读取值。
  •   

我根据你的JSON创建了一个模型:

public class Address
{
    public int Id { get; set; }
    public string State { get; set; }
    public string City { get; set; }
}

public class RootObject
{
    public int Id { get; set; }
    public int Count { get; set; }
    public string StartDate { get; set; } // Keeped as string for simplicity
    public Address Address { get; set; }
}

然后真正简单的方法可以接收这样的JSON:

public RootObject Post(RootObject req)
{
    return req;
}

然后我用Fiddler测试了它:

Method: 
  POST
Headers:
  Content-Type: application/json
Request Body:
  {"Id":0,"Count":0,"StartDate":"\\/Date(-62135596800000)\\/","Address":{"Id":0,"State":"test","City":"test"}} 

和C#代码:

var data = "{\"Id\":0,\"Count\":0,\"StartDate\":\"\\/Date(-62135596800000)\\/\",\"Address\":{\"Id\":0,\"State\":\"test\",\"City\":\"test\"}}";

using (var client = new HttpClient())
{
    HttpContent content = new StringContent(data);
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

    HttpResponseMessage response =
        client.PostAsync("http://my.url", content).Result;
    var result = response.Content.ReadAsStringAsync().Result;
}

在这两种情况下,我都能够将对象送回。

一些提示:

  • 当您使用Fiddler发送JSON时,您应该使用任何转义 对于请求正文。只需输入有效的JSON即可。
  • 在C#代码中,如果你需要用JSON声明一个字符串变量你 将需要使用转义。例如var json = "\"a\":\"b\"";var json = @"""a"":""b""";。如果你从某个地方收到了JSON 否则你就不需要做任何事了。
  • 您永远不应该使用'字符包装JSON。