【问题标题】:PostAsync parameter is always nullPostAsync 参数始终为空
【发布时间】:2020-10-19 20:04:15
【问题描述】:

我正在调用 API Post 方法,但是,我不确定自己做错了什么,但 API 中的值始终为空。我从中调用 API 的方法如下。当我点击它时,我可以看到 Ids 是具有 5 个值的整数列表。

private void Save(List<int> Ids)
{
  var myAPI = ConfigurationManager.AppSettings["MyAPI"];

  string myIds = string.Join(",", Ids);

  using (var client = new HttpClient())
  {

    int result = client.PostAsync(myAPI, new { test = myIds }, new JsonMediaTypeFormatter())
                        .Result
                        .Content
                        .ReadAsAsync<int>()
                        .Result;
  }
}

我的 API 签名如下所示 - 有一个断点,我可以看到它被命中,但测试我尝试传递的参数始终为空

    [HttpPost]
    [Route("api/MyController/SaveData")]
    public HttpResponseMessage SaveData([FromBody]List<string> test)
    {
        try
        {
        //Rest of method removed for brevity

我已尝试从 WebAPI 控制器中删除 [FromBody] 注释,但测试仍然在 SaveData API 方法中使用断点为空

【问题讨论】:

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


    【解决方案1】:

    试试这个:

    private void Save(List<int> Ids)
    {
        var myAPI = ConfigurationManager.AppSettings["MyAPI"];
    
        using (var client = new HttpClient())
        {
            var requestBody = JsonConvert.SerializeObject(Ids);
            var postRequest = new StringContent(requestBody, Encoding.UTF8, "application/json");
    
            var response = client.PostAsync(myAPI, postRequest).GetAwaiter().GetResult();
            var rawResponse = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
            // Do something with the answer
        }
    }
    

    我还建议创建方法 private Task Save 并在该调用之前将 .GetAwaiter().GetResult(); 替换为 await

    【讨论】:

    • 会试一试 - 认为在使用 _httpClient 时回答有错字,我认为应该是客户端
    • Web 方法签名是否必须包含一个名为 postRequest 的参数,是否必须使用 FromBody?
    • 是的,还有List&lt;int&gt; 而不是List&lt;string&gt;
    【解决方案2】:

    在我的例子中,我使用 System.Web.Http.ApiController 而不是 System.Web.Mvc.Controller。所以所有代码看起来像

    public class YourAppController : ApiController
    {
        [System.Web.Http.Route("publish-message")]
        public HttpResponseMessage Post([System.Web.Http.FromBody] string msges)
        {
            //Your Code
            return Request.CreateResponse(HttpStatusCode.OK, "");
    
        }
    }
    
    
    public async Task<string> PublishMessageCall(string publishMessage){                
            var returnval = "";
            string httpWebRqst = "http://localhost:543134535/publish-message";
    
            using (HttpClient myClient = new HttpClient())
            {
                var jsonString = JsonConvert.SerializeObject(publishMessage);
                var content = new StringContent(jsonString, Encoding.UTF8, "application/json");
    
                var response = await myClient.PostAsync(httpWebRqst, content);
    
                var responseString = await response.Content.ReadAsStringAsync();
    
            }
            return await Task.FromResult(returnval);}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2013-01-15
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多