2015-10-26 120 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 - 對它有點誤導。