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

У меня есть следующая структура моего контроллера WEB 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 Internal Server Error.

Если я удалю входные параметры из любого метода, я смогу создать веб-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 Internal Server Error в начальной структуре контроллера API?


person Michael Kniskern    schedule 17.06.2014    source источник


Ответы (3)


Из документации относительно [FromBody]:

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

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

person jgauffin    schedule 17.06.2014
comment
Может стоило прочитать документацию ... :). Я могу обойти внутреннюю ошибку сервера 500, но теперь ни одно из значений, которые я отправляю в объекте JSON, не отправляется. - person Michael Kniskern; 17.06.2014
comment
Я могу заставить спокойный веб-API работать из мобильного приложения Xamarin с помощью объекта System.Net.WebRequest, но не могу заставить его работать с помощью вызова HTML / jQuery. - person Michael Kniskern; 17.06.2014
comment
вы должны установить тип контента на application / json. - person jgauffin; 17.06.2014

Эта ошибка 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);
});
person André Pena    schedule 17.06.2014
comment
Это была опечатка в моем клиентском коде для использования службы. У меня есть действие, определенное в WebApiConfig.cs как api/{controller}/{action} - person Michael Kniskern; 17.06.2014

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

person AlexP    schedule 05.02.2015