Ошибка сервера 500 при вызове RESTFUL Web API через HTTP

#c# #asp.net-mvc-4 #asp.net-web-api2 #restful-url

#c# #asp.net-mvc-4 #asp.net-web-api2 #restful-url

Вопрос:

У меня есть следующая структура для моего контроллера ВЕБ-API:

 public class MyController : ApiController
{
   [System.Web.Http.HttpPost]
   public bool Method1([FromBody] int id, [FromBody] string token, [FromBody] string deviceID, [FromBody] string username)
   {
      bool returnValue = false;

      //do code business logic here

      return returnValue;
   }

   [System.Web.Http.HttpPost]
   public bool Method2([FromBody] int id, [FromBody] string token)
   {
      bool returnValue = false;

      //do code business logic here

      return returnValue;
   }
}
  

Когда я пытаюсь создать RESTFUL Web API через HTTP для или Method1 или Method2 , я получаю внутреннюю ошибку сервера 500.

Если я удалю входные параметры из любого метода, я смогу создать веб-API без ошибок.

Я протестировал контроллер с помощью метода тестирования .NET, и логика не генерирует исключение.

Я добавил дополнительный метод Get с именем без параметров и смог использовать сервис без каких-либо ошибок.

Вот фрагмент кода, в котором я пытаюсь использовать веб-API на JavaScript с помощью jQuery:

 var uri = "http://127.0.0.1/MyWebApi/api/mycontroller/method2";

var myObject =
{
    id: $('#id').val(),
    token: $('#token').val()
};

$.post(uri, JSON.stringify(myObject)).done(function (data) {
    $('#result').text(data);
})
.fail(function (jqXHR, textStatus, err) {
    $('#result').text('Error: '   err);
});
  

Что заставляет меня получать ошибку внутреннего сервера 500 в исходной структуре контроллера API?

Ответ №1:

Из документации, касающейся [FromBody] :

Из тела сообщения разрешено считывать не более одного параметра.

Итак, вам нужно создать модель, которая соответствует параметрам, которые вы публикуете в качестве тела.

Комментарии:

1. Возможно, мне следовало прочитать документацию …:). Я могу преодолеть внутреннюю ошибку сервера 500, но теперь ни одно из значений, которые я отправляю в объекте JSON, не передается.

2. Я могу заставить restful Web API работать из мобильного приложения Xamarin, используя System.Net.WebRequest объект, но не могу заставить его работать с помощью вызова HTML / jQuery.

3. вы должны установить тип содержимого в application / json.

Ответ №2:

Эта ошибка 500, вероятно, связана с тем, что она не находит соответствующее действие на сервере для заданных параметров, учитывая используемый вами метод HTTP (POST).

Не myObject должно быть так? (токен вместо тока)

 var myObject =
{
    id: $('#id').val(),
    token: $('#token').val()
};
  

Кроме того, вам не нужно настраивать объект JSON. Если должно работать так:

 $.post(uri, myObject).done(function (data) {
    $('#result').text(data);
})
.fail(function (jqXHR, textStnatus, err) {
    $('#result').text('Error: '   err);
});
  

Комментарии:

1. Это была опечатка в моем клиентском коде для использования сервиса. У меня есть действие, определенное в WebApiConfig.cs как api/{controller}/{action}

Ответ №3:

У меня была такая же ошибка, и мне потребовалось довольно много времени, прежде чем я смог выяснить, что ее вызывает. Самый простой способ — проверить ваше ответное сообщение из вашего браузера. В IE11 вы можете нажать клавишу F12, перейти на вкладку сеть и начать запись. Затем после выполнения вызова остановите его и просмотрите вызов. В моем случае я обнаружил, что мое возвращенное сообщение не удалось сериализовать из-за циклических ссылок в объекте, который я собирался получить. Итак, с помощью некоторых небольших настроек на стороне веб-API мне удалось заставить его работать просто отлично. Поэтому проверьте свой ответ — вы можете получить более подробную информацию об ошибке.