Web API – 405 – El recurso solicitado no admite el método http ‘PUT’

Tengo un proyecto de API web y no puedo habilitar las solicitudes “PUT / Patch” en su contra.

La respuesta que recibo del violinista es:

HTTP/1.1 405 Method Not Allowed Cache-Control: no-cache Pragma: no-cache Allow: GET,POST,DELETE Content-Type: application/json; charset=utf-8 Expires: -1 Server: Microsoft-IIS/8.0 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcZG90TmV0XFdlYkFQSVxBZFNlcnZpY2VcQWRTZXJ2aWNlXGFwaVxpbXByZXNzaW9uXDE1?= X-Powered-By: ASP.NET Date: Tue, 06 May 2014 14:10:35 GMT Content-Length: 72 {"message":"The requested resource does not support http method 'PUT'."} 

Basado en la respuesta anterior, los verbos “PUT” no son aceptados. Sin embargo, no puedo averiguar dónde está configurado el controlador relacionado.

El método de clase “Put” se declara de la siguiente manera:

 [HttpPatch] [HttpPut] public HttpResponseMessage Put(Int32 aID, [FromBody] ImpressionModel impressionModel) { bla, bla, bla, bla } 

He leído e implementado los cambios explicados en los siguientes subprocesos: – Asp.NET Web API – 405 – el verbo HTTP utilizado para acceder a esta página no está permitido – cómo establecer asignaciones de manejadores – http://www.asp.net/web -api / resumen / pruebas-y-depuración / solución de problemas-http-405-errors-after-publishing-web-api-applications

Nada ha funcionado ya que todavía recibo una respuesta 405 al intentar emitir un comando “PUT” contra mi proyecto de API web.

Incluso comenté todos los “Manejadores” en el archivo ApplicationsHost.config.

Trabajar con VS2012 Premium e IIS Express (supongo que es la versión 8). También probé el servidor VS Dev pero eso también me dio el mismo resultado.

Me he quedado sin ideas. Cualquier ayuda sería apreciada.

Gracias lee

¿Está utilizando el enrutamiento de atributos?

Este error místico fue un problema de atributos de ruta . Esto está habilitado en su WebAPIConfig como:

  config.MapHttpAttributeRoutes(); 

Resulta que los Controladores Web Api “no pueden alojar una combinación de métodos de acción basados ​​en verbos y enrutamiento de nombres de acciones tradicionales”; https://aspnetwebstack.codeplex.com/workitem/184

en pocas palabras: necesitaba marcar todas mis acciones en mi Controlador de API con el atributo [Ruta], de lo contrario, la acción está “oculta” (405’d) al intentar ubicarla a través del enrutamiento tradicional.

Controlador API:

 [RoutePrefix("api/quotes")] public class QuotesController : ApiController { ... // POST api/Quote [ResponseType(typeof(Quote))] [Route] public IHttpActionResult PostQuote(Quote quote) { if (!ModelState.IsValid) { return BadRequest(ModelState); } db.Quotes.Add(quote); db.SaveChanges(); return CreatedAtRoute("", new { id = quote.QuoteId }, quote); } 

nota: mi ruta no tiene nombre, por lo que el nombre CreatedAtRoute () es solo una cadena vacía.

WebApiConfig.cs:

 public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } } 

espero que esto ayude

Tuve exactamente el mismo problema que tú, e intenté todas las cosas que probaste, pero a veces la solución es tan trivial y difícil que no la esperas y sigues buscando razones más complicadas. Asegúrese de que en la url a la que llama para probar sus métodos web, los nombres de los parámetros coincidan con los nombres en la statement del método de su controlador. Mi problema 405 se resolvió simplemente haciendo esto (estaba usando parámetros de consulta):

Mis clientesController:

 ... [HttpPut] public string PutClient(string username = "", string phone= ""){...} 

En mi WebApiConfig:

 // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}" ); 

Y la ruta utilizada para probar el método debe ser así: (use Postman o similar, para aplicar el método web correcto)

 http://localhost:49216/api/clients?username=Kurt&phone=443332211 

De lo contrario, obtendrás un 405 para ese método http en ese controlador. No tuve que cambiar el archivo web.config (no es necesario eliminar webdav, etc.). Compruebe esto para la fuente en la documentación:

Por ejemplo, considere la siguiente acción:

public void Get (int id)

El parámetro id se enlaza al URI. Por lo tanto, esta acción solo puede coincidir con un URI que contenga un valor para “id”, ya sea en el diccionario de ruta o en la cadena de consulta.

Los parámetros opcionales son una excepción, porque son opcionales. Para un parámetro opcional, está bien si el enlace no puede obtener el valor del URI.

Este es también el mensaje de error devuelto si olvida hacer público el método Put () en su controlador API. Lo cual es obvio en retrospectiva, pero me causó unos buenos diez minutos para rascarme la cabeza.

Tenía el mismo problema, necesitaba hacer 3 cosas para resolver esto:

  1. deshabilite Webdav en y
  2. Asegúrese de que HttpPut sea de System.Web.Http y no de System.Web.Mvc cuando use WebAPI
  3. habilitar ExtensionlessUrlHandler como este

Espero que esto pueda ayudar a algunos de ustedes a resolver este problema desagradable …

Esta respuesta solucionó el problema para mí. Tuve que agregar el atributo Ruta y el problema fue resuelto.

  [HttpPut] [Route("")] public HttpResponseMessage MyMethod() 

Esto me sucedió cuando cambié el primer nombre de parámetro del método PUT

 public void Put(int code, [FromBody]Lead lead) 

Debería ser:

 public void Put(int id, [FromBody]Lead lead) 

Y así se llama:

 $.ajax({ type: "PUT", data: json, url: "../api/leadsapi/123", contentType: "application/json; charset=utf-8" }); 

Deberías configurarlo en la configuración de tus servidores web. Depende del tipo de servidor web, donde puede hacerlo. Por ejemplo, mediante IIS, puede usar un archivo web.config para hacerlo en la raíz de su documento. Por solicitudes de origen cruzado, debe agregar encabezados CORS a la respuesta, para permitir orígenes, métodos, etc.

Nota: Probablemente usted también puede hacer algo al respecto con el marco ASP.NET, pero creo que es diferente.

Agregue la siguiente sección en la sección Controlador en web.config:

  

Por ejemplo:

        

Tal vez sea tarde ahora, pero alguien puede usar esto.

Quería usar la solicitud PUT y acabo de enviar un objeto stringificado a la API web y en el método put solo acepté ese objeto.

JQUERY

 let musterija = { Name: name, Email: email, Password: password, Username: logUser.Username, Lastname: lastname, GenderString: gender, Jmbg: identification, PhoneNumber: phone, }; $.ajax({ method: "PUT", url: "/api/Musterija", data: JSON.stringify(musterija), contentType: "application/json; charset=utf-8", dataType: "json", success: function () { alert("Entity updated"); EmptyAllInputs(); $('#divprofile').show(); $('#divupdate').hide(); }, error: function (msg) { alert("Fail - " + msg.responseText); } }); 

API WEB

  [HttpPut] public HttpResponseMessage PutMusterija(Musterija m)