HttpClient.PostAsync始终返回404

时间:2015-10-26 20:43:30

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

我有一个Xamarin.Forms应用程序,它试图将数据发布到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]标记。

从我所看到的情况来看,我的代码与tutorial.

中的resgisterUser代码实际上不同(除了对象名称)

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码和示例之间的唯一区别是您的代码会收到您尝试反序列化的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(假设您发送的json与BarChart类型匹配)。

顺便说一下:在实际GetBarChart的同时命名方法POST - 这有点误导。