405 método no permitido web api

Este error es muy común, y probé todas las soluciones y ninguna de ellas funcionó. He desactivado la publicación de WebDAV en el panel de control y lo he agregado a mi archivo de configuración web:

      

El error aún persiste Este es el controlador:

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

Implementación del método:

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

Y aquí es donde se lanza la excepción:

 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 

¿Alguna sugerencia?

Usted está PUBLICANDO desde el cliente:

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

no PUTING.

Su método API web solo acepta solicitudes PUT.

Asi que:

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

Tuve la misma excepción. Mi problema fue que había usado:

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

DEBIERA SER

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

Intenté hacer muchas cosas para que el método DELETE funcionara (estaba obteniendo 405 métodos no permitidos en la API web), y finalmente agregué [Route (“api / scan / {id}”)] a mi controlador y funcionó bien. Espero que esta publicación ayude a alguien.

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

Mi problema resultó ser Enrutamiento de atributos en WebAPI. Creé una ruta personalizada y la traté como un GET en lugar de que WebAPI descubriera que era una POST

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

Sabía que tenía que ser algo tonto (que consume todo el día)

Estaba obteniendo el 405 en mi llamada GET, y el problema resultó que nombré el parámetro en el método GET del lado del servidor Get(int formId) , y necesitaba cambiar la ruta, o cambiarle el nombre a Get(int id) .

Chrome muchas veces intenta hacer una llamada OPTIONS antes de hacer una publicación. Hace esto para asegurarse de que los encabezados CORS estén en orden. Puede ser problemático si no maneja la llamada OPTIONS en su controlador API.

 public void Options() { } 

También puede obtener el error 405 si, por ejemplo, su método espera un parámetro y no lo está pasando.

Esto NO funciona (error 405)

Vista HTML / Javascript

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

Api web:

 public HttpResponseMessage GetNews(int id) 

Por lo tanto, si la firma del método es como la anterior, debe hacer:

Vista HTML / Javascript

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

Si tienes una ruta como

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

Necesita usar exactamente el mismo nombre de parámetro en el método, por ejemplo

 public ReactorModel GetReactor(reactorId) { ... } 

Si no pasa exactamente el mismo parámetro, puede recibir el error “405 method not allowed” porque la ruta no coincidirá con la solicitud y WebApi aplicará un método de controlador diferente con un método HTTP diferente.

Llego tarde a esta fiesta, pero como nada de lo anterior era viable o funcionaba en la mayoría de los casos, así es como finalmente se resolvió para mí.

En el servidor en el que se alojó el sitio / servicio, se requiere una función. ACTIVACIÓN HTTP !!!

Administrador del servidor> Administrar> Agregar funciones y funciones> siguiente siguiente siguiente hasta llegar a Funciones> En .NET (cada versión), marque Activación HTTP. También tenga en cuenta que hay uno oculto en> net> Servicios WCF.

¡Esto funcionó al instante! Eso estaba derritiendo mi cerebro

Esto no responde a tu pregunta específica, pero cuando tuve el mismo problema terminé aquí y pensé que más personas podrían hacer lo mismo.

El problema que tuve fue que había declarado indeleblemente mi método Get como estático . Me perdí esta una mañana entera, y no causó advertencias por atributos o similares.

Incorrecto:

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

Correcto:

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

Aquí hay una solución

artículo de la solución docs.microsoft.com

y eliminar WebDAV de los módulos

Este error también puede ocurrir cuando intenta conectarse a http mientras el servidor está en https.

Fue un poco confuso porque mis solicitudes de obtención estaban bien, el problema solo estaba presente con las post-solicitudes.

[HttpPost] es innecesario!

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

No pude resolver esto. Tenía habilitado CORS y funcionaba siempre que el POST devolviera el vacío (ASP.NET 4.0 – WEBAPI 1). Cuando traté de devolver un HttpResponseMessage, comencé a obtener la respuesta HTTP 405.

En base a la respuesta anterior de Llad, eché un vistazo a mis propias referencias.

Tenía el atributo [System.Web.Mvc.HttpPost] listado encima de mi método POST.

Cambié esto para usar:

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

Esto solucionó mis problemas. Espero que esto ayude a alguien más.

Para completar, tenía lo siguiente en mi web.config:

           

compruebe el archivo .csproj de su proyecto y cambie

 http://localhost:PORT/ 

a la URL de su sitio web como esta

 http://example.com:applicationName/ 

Otro posible problema que causa el mismo comportamiento son los parámetros predeterminados en el enrutamiento. En mi caso, el controlador se localizó y se creó una instancia correctamente, pero el POST se bloqueó debido a la acción predeterminada Get especificada:

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

Estaba teniendo exactamente el mismo problema. Busqué durante dos horas lo que estaba mal con la falta de suerte hasta que me di cuenta de que mi método POST era private lugar de public .

Es divertido ver ahora que el mensaje de error es algo genérico. ¡Espero eso ayude!