2015-10-26 122 views
0

我有尝试将数据发布到Web API一个Xamarin.Forms应用。 (Web API 2 & MVC)。HttpClient.PostAsync总是返回404

我遇到的问题是,我的HttpResponse总是返回404 - 甚至当我知道这个应用程序可以contect到服务器。 (获取数据是罚款,不得发布。)

的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代码不同(除了对象名称)在此tutorial.

预先感谢您!

+0

你有'APIRoot'设置是否正确?你有没有尝试把完整的URL放在代码中而不是构造它? – mydogisbox

+0

你的Xamarin应用试图打哪个网址?你有没有试过通过'Fiddler'来打电话? – Jonesopolis

+0

'APIRoot'也用于检索数据,完美的工作! – KidCode

回答

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(只要你发送匹配BarChart类型JSON)。

顺便说一句:命名方法GetBarChart,而你实际上是POST - 对它有点误导。