簡體   English   中英

來自PostAsync的HttpPost始終為null

[英]HttpPost from PostAsync always null

我將不知所措,試圖弄清楚如何將POST參數傳遞給ASPNET CORE 2.0中的Web API方法。

我有一個C#客戶端應用程序和一個C#服務器應用程序。

  • 我嘗試在Web Api方法上使用[FromBody]。
  • 我嘗試將內容類型設置為“ application / json”
  • 我已將控制器操作簡化為盡可能基本
  • 我嘗試傳遞一個字符串和一個復雜的對象。

總是為空。 到底是怎么回事?

客戶代碼

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默認活頁夾為您反序列化模型,您無需手動完成。 具體來說,您不能將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 });
      }
    }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM