ОПЦИИ 405 (метод не разрешен) web api 2
Я создал веб-api 2, и я пытаюсь выполнить кросс-доменный запрос, но я получаю следующую ошибку:
ОПЦИИ http://www.example.com/api/save 405 (метод не разрешен)
Я посмотрел вокруг, и большинство решений для этой проблемы говорят, что мне нужно установить COR из NuGet и включить его, чтобы я установил пакет и пометил мой контроллер
[EnableCors("*", "*", "*")]
Но это еще не решило проблему.
Мой ApiController
имеет только Save
метод:
[ResponseType(typeof(int))]
public IHttpActionResult Save(Student student)
{
if (ModelState.IsValid)
{
using (StudentHelper helper = new StudentHelper())
{
return Ok(helper.SaveStudent(student));
}
}
else
{
return BadRequest(ModelState);
}
}
Это мой js из другого домена:
$.ajax({
type: "POST",
crossDomain: true,
data: JSON.stringify(student),
crossDomain: true,
url: 'http://www.example.com/api/save',
contentType: "application/json",
success: function (result) {
console.log(result);
}
});
Есть ли что-то еще, чтобы сделать это?
Ответы
Ответ 1
В конце концов я решил это, изменив запрос ajax. Я узнал, что предпросмотр OPTIONS
отправляется только в определенных ситуациях - один из них - если запрос содержит Content-Type
, который не является одним из следующих типов:
- применение/х-WWW-форм-urlencoded
- многочастному/форм-данных
- Текст/равнина
Итак, удалив контент-тип в моем ajax-запросе и изменив его на следующее:
$.ajax({
type: "POST",
crossDomain: true,
data: student,
dataType: 'json',
url: 'http://www.example.com/api/save',
success: function (result) {
console.log(result);
}
});
Мне удалось заставить его работать.
Эта страница содержит полезную информацию о простых запросах и о том, как избежать предполетных запросов
Ответ 2
Через nuget выполните установку пакета веб-API CORS для вашего проекта:
Установочный пакет Microsoft.AspNet.WebApi.Cors
В WebApiConfig добавьте следующие строки:
var cors = new EnableCorsAttribute ("*", "*", "*");
config.EnableCors (cors);
Ответ 3
Убедитесь, что у вас есть OPTIONS как один из разрешенных глаголов в вашем web.config и что он обрабатывается обработчиком по умолчанию.
<system.web>
...
<httpHandlers>
...
<add path="*" verb="OPTIONS" type="System.Web.DefaultHttpHandler" validate="true"/>
<add path="*" verb="TRACE" type="System.Web.DefaultHttpHandler" validate="true"/>
<add path="*" verb="HEAD" type="System.Web.DefaultHttpHandler" validate="true"/>
Ответ 4
Также попробуйте использовать параметр запроса ajax withcredentials
$.ajax({
type: "POST",
crossDomain: true,
data: JSON.stringify(student),
withCredentials: true,
url: 'http://www.example.com/api/save',
contentType: "application/json",
success: function (result) {
console.log(result);
}
});
Ответ 5
Это решило мою проблему
Шаг 1
Установите пакет Cors Microsoft.AspNet.WebApi.Cors (щелкните правой кнопкой мыши> Управление пакетом Nuget> и затем найдите Cors)
Шаг 2
поместите эту строку в файл WebApiConfig.cs
public static void Register(HttpConfiguration config)
{
config.EnableCors(new EnableCorsAttribute("http://localhost:3000", headers: "*", methods: "*"));
.
.
.
}
Изменить http://localhost: 3000 на адрес вызывающего API