ОПЦИИ 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