2014-10-30 9 views
15

Stworzyłem API Web 2 i próbuję zrobić przekrój żądania domeny do niego, ale ja dostaję następujący błąd:OPCJE 405 (Method Not Allowed) api web 2

OPTIONS http://www.example.com/api/save 405 (Method Not Allowed)

I miał rozejrzeć i większość uchwał tego problemu mówią, że muszę zainstalować Cors z Nuget i włączyć ją więc mam zainstalowany pakiet i oznaczony mojego kontrolera z

[EnableCors("*", "*", "*")] 

Ale to jeszcze nie rozstrzygnęło problem.

My ApiController tylko posiada następujące Save metoda:

[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); 
    } 
} 

To jest mój js z innej domeny:

$.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); 
    } 
}); 

Czy coś jeszcze muszę zrobić, aby to umożliwić?

Odpowiedz

1

W końcu rozwiązali to zmieniając żądania AJAX. I okazało się, że OPTIONS inspekcji wstępnej jest wysyłane tylko w pewnych sytuacjach - jednym z nich jest, jeżeli wniosek zawiera Content-Type że nie jest jeden z następujących typów:

  • application/x-www-form-urlencoded
  • wieloczęściowy/form-data
  • text/plain

Więc usuwając typ zawartości w moim żądania ajax i zmieniając go na następujące kwestie:

$.ajax({ 
    type: "POST", 
    crossDomain: true, 
    data: student, 
    dataType: 'json', 
    url: 'http://www.example.com/api/save', 
    success: function (result) { 
     console.log(result); 
    } 
}); 

Udało mi się sprawić, że działa.

This page has useful information about simple requests and how to avoid preflight requests

+3

To nie rozwiązuje problemu, unika go. Dla tych, którzy muszą faktycznie obsługiwać żądania OPTLINE o preflightach, nie jest to użyteczne. – defines

+1

@defines to rozwiązuje mój problem, więc nie ma potrzeby, aby cokolwiek robić - moim problemem było to, że potrzebowałem prostej prośby, ponieważ nie musiałem obsługiwać preflight. Jeśli ktoś szuka sposobu obsługi preflight, to nie chodzi o to, chodzi o to, w jaki sposób mogę uzyskać moje wezwanie ajax, aby porozmawiać z moim interfejsem API - a odpowiedź brzmi: złożyć prostą prośbę, a nie włączyć obsługę preflight –

+1

Tytuł pytania dotyczy OPCJI zwracających 405. Całkowicie unikasz żądania OPTIONS. To nie jest odpowiedź na to, po prostu go unika. – defines

1

Upewnij się, że masz OPCJE jako jeden z dozwolonych czasowników w pliku web.config i że jest on obsługiwany przez domyślną procedurę obsługi.

<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"/> 
0

Sponsorowane używając opcji withcredentials żądania ajax

$.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); 
    } 
    }); 
+0

Cześć Próbowałem to, ale nie działa –

+0

OK! czy twój plik konfiguracyjny webapi wygląda tak? public static class WebApiConfig { public static void Register (konfiguracja HttpConfiguration) { // Nowy kod config.EnableCors(); config.Routes.MapHttpRoute ( nazwa: "DefaultApi", routeTemplate: "api/{controller}/{id}", domyślnie: nowy {id = RouteParameter.Optional} ); } } – Bilal

+0

Punkt szczególny to config.EnableCors(); – Bilal

18

Via Nuget zrobić instalację internetowej pakietu Cors API dla swojego projektu:

Install-Package Microsoft.AspNet.WebApi.Cors

W WebApiConfig dodać następujące wiersze:

var cors = new EnableCorsAttribute ("*", "*", "*"); 
config.EnableCors (cors); 
+1

Musiałem usunąć gwiazdkę dla parametru pochodzenia i ustawić adres URL: 'nowy EnableCorsAttribute (" https: // myservicesite "," * "," * ");' Z parametrem gwiazdy żądanie OPTIONS zawsze wysyła błąd 405 ... – NicoD

+0

PO stwierdził, że już wypróbowali to i nie zadziałało. –

Powiązane problemy