2015-10-26 10 views
0

У меня есть приложение Xamarin.Forms, которое пытается отправить данные в веб-API. (Web API 2 & MVC).HttpClient.PostAsync всегда возвращает 404

Проблема, с которой я столкнулась, заключается в том, что мой 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 - Server Side Код:

[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

Какой URL-адрес вашего приложения 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 (если вы отправить JSON, который соответствует типу BarChart).

Кстати: назовем метод GetBarChart, пока вы на самом деле POST -в его несколько вводит в заблуждение.

Смежные вопросы