Metodo 405 non consentito web api

Questo errore è molto comune e ho provato tutte le soluzioni e non hanno funzionato. Ho disabilitato la pubblicazione WebDAV nel pannello di controllo e l’ho aggiunto al mio file di configurazione web:

      

L’errore persiste ancora. Questo è il controller:

  static readonly IProductRepository repository = new ProductRepository(); public Product Put(Product p) { return repository.Add(p); } 

Implementazione del metodo:

  public Product Add(Product item) { if (item == null) { throw new ArgumentNullException("item"); } item.Id = _nextId++; products.Add(item); return item; } 

E qui è dove viene lanciata l’eccezione:

 client.BaseAddress = new Uri("http://localhost:5106/"); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); var response = await client.PostAsJsonAsync("api/products", product);//405 exception 

Eventuali suggerimenti?

    Stai postando dal client:

     await client.PostAsJsonAsync("api/products", product); 

    non PUTING.

    Il tuo metodo API Web accetta solo richieste PUT.

    Così:

     await client.PutAsJsonAsync("api/products", product); 

    Ho avuto la stessa eccezione. Il mio problema era che avevo usato:

     using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!! [HttpGet] public string Blah() { return "blah"; } 

    DOVREBBE ESSERE

     using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!! [HttpGet] public string Blah() { return "blah"; } 

    Ho provato molte cose per far funzionare il metodo DELETE (stavo ottenendo il metodo 405 non autorizzato web api), e infine ho aggiunto [Route (“api / scan / {id}”)] al mio controller e funzionava bene. spero che questo post aiuti qualcuno.

      // DELETE api/Scan/5 [Route("api/scan/{id}")] [ResponseType(typeof(Scan))] public IHttpActionResult DeleteScan(int id) { Scan scan = db.Scans.Find(id); if (scan == null) { return NotFound(); } db.Scans.Remove(scan); db.SaveChanges(); return Ok(scan); } 

    Il mio problema si è rivelato essere l’instradamento degli attributi in WebAPI. Ho creato un percorso personalizzato e lo trattava come un GET invece di WebAPI scoprendo che era un POST

      [Route("")] [HttpPost] //I added this attribute explicitly, and it worked public void Post(ProductModel data) { ... } 

    Sapevo che doveva essere qualcosa di sciocco (che consuma tutto il giorno)

    Stavo ricevendo il 405 sulla mia chiamata GET, e il problema è risultato che ho chiamato il parametro nel metodo GET lato server Get(int formId) , e avevo bisogno di cambiare il percorso, o rinominarlo Get(int id) .

    Chrome spesso cerca di fare una chiamata OPTIONS prima di fare un post. Lo fa per assicurarsi che le intestazioni CORS siano in ordine. Può essere problematico se non stai gestendo la chiamata OPTIONS nel tuo controller API.

     public void Options() { } 

    Puoi anche ottenere l’errore 405 se dici che il tuo metodo è in attesa di un parametro e non lo stai trasmettendo.

    Questo NON funziona (errore 405)

    Vista HTML / Javascript

     $.ajax({ url: '/api/News', //..... 

    Web Api:

     public HttpResponseMessage GetNews(int id) 

    Quindi se la firma del metodo è come sopra allora devi fare:

    Vista HTML / Javascript

     $.ajax({ url: '/api/News/5', //..... 

    Se hai un percorso come

     [Route("nuclearreactors/{reactorId}")] 

    È necessario utilizzare lo stesso identico nome del parametro nel metodo, ad es

     public ReactorModel GetReactor(reactorId) { ... } 

    Se non si passa lo stesso identico parametro, è ansible che venga visualizzato l’errore “Metodo 405 non consentito” poiché la route non corrisponderà alla richiesta e WebApi colpirà un metodo di controllo diverso con un metodo HTTP diverso consentito.

    Sono in ritardo per questa festa, ma poiché nella maggior parte dei casi non c’era nulla di valido o funzionante, ecco come è stato finalmente risolto per me.

    Sul server in cui il sito / servizio è stato ospitato, era necessaria una funzionalità! ATTIVAZIONE HTTP !!!

    Server Manager> Gestisci> Aggiungi ruoli e funzionalità> il prossimo prossimo fino a quando non si arriva a Funzionalità> Sotto .NET (ogni versione) spuntano Attivazione HTTP. Nota anche che c’è uno nascosto sotto> net> Servizi WCF.

    Questo ha funzionato all’istante! Mi stava sciogliendo il cervello

    Questo non risponde alla tua domanda specifica, ma quando ho avuto lo stesso problema sono finito qui e ho capito che più persone potrebbero fare lo stesso.

    Il problema che avevo era che avevo indeliberamente dichiarato statico il mio metodo Get. Mi è mancata un’intera mattinata e non ha causato avvisi da parte di attributi o simili.

    non corretto:

     public class EchoController : ApiController { public static string Get() { return string.Empty; } } 

    Corretta:

     public class EchoController : ApiController { public string Get() { return string.Empty; } } 

    Ecco una soluzione

    docs.microsoft.com articolo di soluzione

    e rimuovere WebDAV dai moduli

    Questo errore può verificarsi anche quando si tenta di connettersi a http mentre il server è su https.

    È stato un po ‘di confusione perché le mie richieste di acquisizione erano OK, il problema era presente solo con le richieste successive.

    [HttpPost] non è necessario!

     [Route("")] public void Post(ProductModel data) { ... } 

    Non potrei risolvere questo. Avevo abilitato CORS e funzionavo fino a quando il POST non restituiva nulla (ASP.NET 4.0 – WEBAPI 1). Quando ho provato a restituire un messaggio HttpResponseMessage, ho iniziato a ricevere la risposta HTTP 405.

    Basandomi sulla risposta di Llad riportata sopra, ho dato un’occhiata ai miei riferimenti personali.

    Ho avuto l’attributo [System.Web.Mvc.HttpPost] elencato sopra il mio metodo POST.

    Ho cambiato questo da usare:

     [System.Web.Http.HttpPostAttribute] [HttpOptions] public HttpResponseMessage Post(object json) { ... return new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; } 

    Questo ha risolto i miei problemi. Spero che questo aiuti qualcun’altro.

    Per completezza, ho avuto il seguente nel mio web.config:

               

    controlla il tuo file .csproj del progetto e cambia

     http://localhost:PORT/ 

    al tuo sito web url come questo

     http://example.com:applicationName/ 

    Un altro ansible problema che causa lo stesso comportamento sono i parametri predefiniti nel routing. Nel mio caso il controller è stato localizzato e istanziato correttamente, ma il POST è stato bloccato a causa dell’azione Get predefinita specificata:

     config.Routes.MapHttpRoute( name: "GetAllRoute", routeTemplate: "api/{controller}.{ext}"/*, defaults: new { action = "Get" }*/ // this was causing the issue ); 

    Stavo avendo esattamente lo stesso problema. Ho cercato per due ore cosa fosse sbagliato senza fortuna finché non ho realizzato che il mio metodo POST era private anziché public .

    Divertente ora vedendo che il messaggio di errore è un po ‘generico. Spero che sia d’aiuto!