发布对象参数

时间:2015-04-10 19:42:59

标签: asp.net-mvc asp.net-web-api json.net http-post restful-url

我需要调用一个在Controller中定义的Post方法,它有一个JObject参数。

当我使用PostAsJsonAsync或PostAsync调用此方法时,我收到500错误代码。

下面的代码显示了我如何调用此Post方法:

using (var client = new HttpClient())
{ 
client.BaseAddress = new Uri("http://localhost:54810");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var jsonObject = new JObject();
dynamic json = jsonObject; 
json.Add("mytoken", "teste");

json.eventos = new JArray() as dynamic;

dynamic evento = new JObject();
evento.ID = 1;
evento.Latitude = 50;
evento.Longitude = 20;
evento.Local = 30;

json.eventos.Add(evento);

HttpResponseMessage response = await client.PostAsJsonAsync("api/eventocontrole", jsonObject);

response.IsSuccessStatusCode 属性返回false。

如果我将此参数类型从JObject更改为任何其他自定义类(例如User,Product,Cart),则属性 IsSuccessStatusCode 将返回 true

我是否错误地使用了JObject?我不应该使用JObject作为参数吗?

只是为了澄清,我正在使用JObject,因为我需要传递一个对象列表和一个令牌字符串来验证我的请求。

2 个答案:

答案 0 :(得分:1)

尝试将序列化数据发送为StringContent

string jsonData = jsonObject.ToString();
var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync("api/eventocontrole", content);

答案 1 :(得分:0)

我不能像参数一样使用JObject。

经过多次测试,唯一的解决方案是创建自定义类

public class RequestData<T>
{
    public T data { get; set; }
    public string token { get; set; }
}

下面的测试是调用此服务器方法:

using (var client = new HttpClient())
{ 
  client.BaseAddress = new Uri("http://localhost:54810");
  client.DefaultRequestHeaders.Accept.Clear();
  client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

  List<EventoControle> eventos = new List<EventoControle>();

  EventoControle evento = new EventoControle();
  evento.ID = 1;
  evento.Latitude = 50;
  evento.Longitude = 20;    
  evento.Local = 30;

  eventos.Add(evento); 

  RequestData<List<EventoControle>> rq = new RequestData<List<EventoControle>>();
  rq.data = eventos;
  rq.token = "teste";

  HttpResponseMessage response = await client.PostAsJsonAsync<RequestData<List<EventoControle>>>("api/eventocontrole", rq);
  if (response.IsSuccessStatusCode)
  {
  }                                   
}

我的服务器方法:

public void PostEventoControle(RequestData<List<EventoControle>> json)