#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 мне удалось заставить его работать просто отлично. Поэтому проверьте свой ответ — вы можете получить более подробную информацию об ошибке.