HttpClient.PostAsync总是返回404

本文关键字:返回 PostAsync HttpClient | 更新日期: 2023-09-27 18:19:16

我有一个Xamarin。表单应用程序试图将数据发布到Web API。Web API 2 &MVC) .

我遇到的问题是,我的HttpResponse总是返回404 -即使我知道应用程序可以连接到服务器。(获取数据是好的,发布不是。)

Xamarin代码:(客户端-忽略方法的返回类型,我已经删除了很多业务逻辑!)

    //Method that passes the route and param to getChartData()
    private BarChartModel getChartData ()
    {
        string postData = JsonConvert.SerializeObject (this);
        string chartData = FRAPI.GetDataWithData ("BARCHART/GETBARCHART/", postData);
        return JsonConvert.DeserializeObject<BarChartModel> (chartData);
    }

    //method that connects to the web api.
    public static string GetDataWithData (string route, string data)
    {
        using (var client = new HttpClient ())
        {
            client.BaseAddress = new Uri (APIRoot);
            var content = new StringContent (data, System.Text.Encoding.UTF8, "application/json");
            HttpResponseMessage response = client.PostAsync (route, content).Result;
            if (response.IsSuccessStatusCode)
            {
                response.EnsureSuccessStatusCode ();
            }
            else {//blah}
        }
    }

API -服务器端代码:

    [HttpPost]
    [Route("api/BarChart/GetBarChart/{data}")]
    public HttpResponseMessage GetBarChart(string data)
    {
        try
        {
           BarChart barChart = JsonConvert.DeserializeObject<BarChart>(data, GlobalSettings.JsonSettings);
           return Request.CreateResponse(HttpStatusCode.OK, "true");
        }
        catch (Exception ex)
        {
           return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
        }
    }

路由配置:

    config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{action}/{id}",
         defaults: new { id = RouteParameter.Optional }
    );

值得一提的是,我已经尝试了许多服务器端代码的变体,包括:

  • 从路由中移除{data}部分。(下面的教程有一个类似的路线,不包括路线。)
  • 方法签名中包含[FromBody]标签

从我所看到的,我的代码实际上与本教程中的resgisterUser代码没有什么不同(除了对象名称)。

提前感谢!

HttpClient.PostAsync总是返回404

您的代码和示例之间的唯一区别是您的代码接收您试图反序列化的string。你应该让ASP。Net为您做反序列化。换句话说,像这样修改代码:

[HttpPost]
[Route("api/BarChart/GetBarChart")]
public HttpResponseMessage GetBarChart(BarChart barChart)
{
    try
    {
       Debug.WriteLine(barChart);
       // do something useful with the barChart...
       return Request.CreateResponse(HttpStatusCode.OK, "true");
    }
    catch (Exception ex)
    {
       return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
    }
}

和ASP。Net将请求的主体反序列化为BarChart(前提是你发送一个与BarChart类型匹配的json)。

顺便说一下:将方法命名为GetBarChart,而实际上是POST -ing,这有点误导。