【问题标题】:Post with JObject Parameter使用对象参数发布
【发布时间】:2015-04-10 19:42:59
【问题描述】:

我需要调用一个控制器中定义的 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 更改为任何其他自定义类(例如,用户、产品、购物车),属性 IsSuccessStatusCode 将返回 true

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

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

【问题讨论】:

  • 您确定您使用 JObject 创建的数据签名与服务器的预期相符吗?检查通过线路传输的实际数据(您已经这样做了,但尚未显示端点签名)。我还将检查从服务器返回的实际错误消息 - 如果您使用 Fiddler 并在调试模式下运行,您应该在 MVC/WebApi 错误消息中获得更多错误信息(最有可能是黄屏死机)。

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


【解决方案1】:

尝试以StringContent发送序列化数据:

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

【讨论】:

  • 您是否已验证 jsonData 包含预期的 JSON 字符串?您还可以使用 Fiddler 检查发送到服务器的实际 HTTP 有效负载。针对此 HTTP 请求调试服务器端点也可能会显示有关可能引发的错误的更多信息。
  • { "mytoken": "teste", "eventos": [ { "ID": 1, "Latitude": 50, "Longitude": 20, "Local": 30 } ] }
  • 太棒了,似乎是正确的有效载荷。您是否已验证正在设置 Content-Type: application/json 请求标头?如果这是真的,那么您可能需要调试您的服务器端代码以查看它为什么失败,因为请求似乎很好。看来问题出在接收部分。
  • ((System.Net.Http.Headers.HttpHeaders)(response.RequestMessage.Content.Headers)).ToString() 返回: Content-Type: application/json; charset=utf-8 内容长度:247
  • 好的,是时候调试你的服务器代码了。问题似乎不在客户端。您可以使用 Fiddler 重放相同的请求并在服务器端操作中放置断点以查看它崩溃的原因。
【解决方案2】:

我不能使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 2020-03-15
    • 2018-11-20
    • 1970-01-01
    • 2017-10-23
    • 2012-12-30
    • 2018-10-06
    相关资源
    最近更新 更多