recurso - c# web api put 405 method not allowed
Web API-405-El recurso solicitado no admite el método http ''PUT'' (9)
¿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
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/overview/testing-and-debugging/troubleshooting-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
Agregue la siguiente sección en la sección Controlador en web.config:
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Por ejemplo:
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
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 también pueda hacer algo al respecto con el marco ASP.NET, pero creo que es diferente.
Esta respuesta solucionó el problema para mí. Tuve que agregar el atributo Ruta y el problema se resolvió.
[HttpPut]
[Route("")]
public HttpResponseMessage MyMethod()
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.
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"
});
Tal vez sea tarde ahora, pero alguien puede usar esto.
Quería usar la solicitud PUT y acabo de enviar un objeto de cadena 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)
Tenía el mismo problema, necesitaba hacer 3 cosas para resolver esto:
- deshabilite Webdav en
<modules>
y<handlers>
- Asegúrese de que HttpPut sea de System.Web.Http y no de System.Web.Mvc cuando use WebAPI
- habilitar ExtensionlessUrlHandler como este
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%/Microsoft.NET/Framework/v4.0.30319/aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%/Microsoft.NET/Framework64/v4.0.30319/aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Espero que esto pueda ayudar a algunos de ustedes a resolver este problema desagradable ...
Tuve exactamente el mismo problema que tú, e intenté todas las cosas que intentaste, pero a veces la solución es tan trivial y difícil de entender, que simplemente no lo 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 declaración del método del controlador. Mi problema 405 se resolvió simplemente haciendo esto (estaba usando los 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 en absoluto (no es necesario eliminar webdav, etc.). Compruebe this 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.