2014-10-30 5 views
15

ho creato un'API web 2 e sto cercando di fare una richiesta di dominio trasversale ad esso, ma sto ottenendo il seguente errore:OPZIONI 405 (Metodo non ammessi) API Web 2

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

I hanno avuto un'occhiata in giro e la maggior parte delle soluzioni per questo problema stanno dicendo che devo installare COR da NuGet e consentire così ho installato il pacchetto e segnato la mia controller con

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

Ma questo ancora non ha risolto il problema.

mio ApiController solo ha il seguente metodo Save in:

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

Questo è il mio js da un dominio diverso:

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

C'è qualcos'altro che devo fare per attivare questo?

risposta

1

Alla fine ho risolto cambiando la richiesta AJAX. Ho scoperto che la OPTIONS preflight viene inviato solo in determinate situazioni - uno dei quali è se la richiesta contiene un Content-Type che non è uno dei seguenti tipi:/

  • applicazione x-www-form-urlencoded
  • multipart/form-data
  • text/plain

Così rimuovendo il tipo di contenuto nella mia richiesta Ajax e cambiando al seguente:

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

Sono riuscito a farlo funzionare.

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

+3

Questo non risolve il problema, lo evita. Per coloro che hanno bisogno di supportare effettivamente le richieste OPZIONI di preflight, questo non è utile. – defines

+1

@definisce questo risolve il mio problema quindi non c'è bisogno di downvotare - il mio problema era che avevo bisogno di una semplice richiesta in quanto non avevo bisogno di supportare il preflight. Se qualcuno sta cercando come supportare il preflight, questa domanda non riguarda questo, riguarda come potrei ottenere la mia chiamata ajax per parlare alla mia web API - e la risposta era di fare una semplice richiesta, non per abilitare il supporto per preflight –

+1

Il titolo della domanda riguarda OPZIONI restituendo 405. Si evita del tutto la richiesta OPZIONI. Questa non è una risposta a tutto ciò, semplicemente lo evita. – defines

1

Assicurarsi di avere OPZIONI come verbo consentito nel proprio web.config e che viene gestito dal gestore predefinito.

<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

correlate utilizzando l'opzione richiesta withcredentials 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

Ciao ho provato questo, ma non ha funzionato –

+0

Ok! il tuo file di configurazione webapi è simile a questo? public static class WebApiConfig { public static void Registro (HttpConfiguration config) { // Nuovo codice config.EnableCors(); config.Routes.MapHttpRoute ( nome: "DefaultApi", routeTemplate: "api/{controller}/{id}", valori predefiniti: nuovo {id = RouteParameter.Optional} ); } } – Bilal

+0

Il punto di interesse è config.EnableCors(); – Bilal

18

Via NuGet rendere l'installazione del pacchetto di API web CORS per il progetto:

Install-Package Microsoft.AspNet.WebApi.Cors

In WebApiConfig aggiungere le seguenti righe:

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

Ho dovuto rimuovere la stella per il parametro di origine e impostare un url: 'new EnableCorsAttribute (" https: // myservicesite "," * "," * ");' Con il parametro stella la richiesta OPZIONI invia sempre un errore 405 ... – NicoD

+0

Il PO ha dichiarato di aver già provato questo e non ha funzionato. –