c# - 来自 PostAsync 的 HttpPost 始终为 null

标签 c# asp.net-core

我快要发疯了,想弄清楚如何将 POST 参数传递给 ASPNET CORE 2.0 中的 Web API 方法。

我有一个 C# 客户端应用程序和一个 C# 服务器应用程序。

  • 我试过在 Web Api 方法上使用 [FromBody]。
  • 我试过将内容类型设置为“application/json”
  • 我已将我的 Controller 操作简化为尽可能基本
  • 我试过同时传递字符串和复杂对象。

它总是空的。这是怎么回事?

客户端代码:

private static async Task SendCustomObject()
{
    var controllerName = "BasicApi";
    var basicClientApi = string.Format("http://localhost:5100/api/{0}", controllerName);

    using (var httpClient = new HttpClient()){

        var packetData = new TestPacket();
        var jsonObj = new { json = packetData };
        JObject jobject = JObject.FromObject(packetData);

        var json = JsonConvert.SerializeObject(jobject);
        var content = new StringContent(json, Encoding.UTF8, "application/json");
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        // This doesn't help:
        //httpClient.DefaultRequestHeaders.Accept.Clear();
        //httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

        var response = await httpClient.PostAsync(basicClientApi, content);                    

        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine(response.StatusCode);
        }
        else
        {
            var rawResponse = await response.Content.ReadAsStringAsync();                        

            JObject o = JObject.Parse(rawResponse);
            Console.WriteLine(o.ToString());    
        }
    }
}

服务器代码:

namespace myApp.Controllers
{
    [Route("api/[controller]")]
    public class BasicApiController : Controller
    {    

      [HttpPost]    
      public JsonResult Post([FromBody] string json) // json is always null!
      {                

        var jsonData = JsonConvert.DeserializeObject<Models.TestPacket>(json);
        return Json(new { result = true });

      }
    }
 }

最佳答案

ASP.NET Core 默认绑定(bind)器会为您反序列化模型,您无需手动执行。具体来说,您不能将 object 视为 string

看看这个更简单的例子:

private static async Task SendCustomObject()
{
    var controllerName = "BasicApi";
    var basicClientApi = string.Format("http://localhost:5100/api/{0}", controllerName);

    using (var httpClient = new HttpClient()){

        var packetData = new TestPacket();
        var jsonObj = new { json = packetData };

        var json = JsonConvert.SerializeObject(jsonObj); // no need to call `JObject.FromObject`
        var content = new StringContent(json, Encoding.UTF8, "application/json");
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var response = await httpClient.PostAsync(basicClientApi, content);                    

        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine(response.StatusCode);
        }
        else
        {
            var rawResponse = await response.Content.ReadAsStringAsync();                        

            JObject o = JObject.Parse(rawResponse);
            Console.WriteLine(o.ToString());    
        }
    }
}

namespace myApp.Controllers
{
    [Route("api/[controller]")]
    public class BasicApiController : Controller
    {    

      [HttpPost]    
      // don't ask for a string, ask for the model you are expecting to recieve
      public JsonResult Post(Models.TestPacket json)
      {                
           return Json(new { result = true });
      }
    }
 }

关于c# - 来自 PostAsync 的 HttpPost 始终为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51111132/

相关文章:

asp.net - 如何在 Razor 页面中重定向到自定义404页面

c# - 我的 ASP.NET Core 应用服务 Web API 如何支持 AAD 承载 token 和客户端证书身份验证?

c# - 无法从 Controller 返回 HTML

c# - ListView 问题 - 需要工具提示

validation - asp .net core - 自定义验证错误未显示在 View 中

visual-studio - CreateAppHost 任务意外失败。 MSB4018

c# - 关闭后重新打开 SqlDataReader

c# - 'await Task.Delay(5000)'之后的代码直到relaycommand执行完成才执行

c# - 如何在 Wikipedia API 中使用特殊字符?

c# - Nuget 防止在解决方案中生成包文件夹