asp.net mvc - used - WebAPI Delete no funciona-405 Método no permitido
method not allowed asp net core (12)
¡Encontré la solución eventualmente! Si encuentra el mismo problema, agregue lo siguiente a su web.config
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/> <!-- ADD THIS -->
</modules>
... rest of settings here
espero que esto ayude
Agradezco cualquier ayuda sobre esto ya que se supone que el sitio se pondrá en marcha esta noche.
Tengo un controlador de API web con un método de eliminación. El método funciona bien en mi máquina local que ejecuta IIS Express (Windows 8) pero tan pronto como lo implementé en el servidor IIS activo (Windows Server 2008 R2) dejó de funcionar y arroja el siguiente mensaje de error:
HTTP Error 405.0 - Método no permitido La página que está buscando no se puede mostrar porque se está utilizando un método no válido (Verbo HTTP)
He buscado soluciones en la web e implementé las más razonables. Mi configuración web tiene la siguiente configuración:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<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" />
</handlers>
</system.webServer>
También intenté cambiar las asignaciones de controlador y filtrado de solicitudes en IIS sin ningún resultado. Tenga en cuenta que las Reglas de creación de WebDAV en IIS parecen estar deshabilitadas.
Cualquier idea será muy apreciada Gracias.
Después de probar casi todas las soluciones aquí, esto funcionó para mí. Agregue esto en su archivo de configuración de API
<system.webServer>
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<modules>
<remove name="WebDAVModule" />
</modules>
</system.webServer>
El atributo [HttpPost] en la parte superior del método Delete resolvió este problema para mí:
[HttpPost]
public void Delete(int Id)
{
//Delete logic
}
El verbo Javascript para HTTP DELETE
debe ser así:
$.ajax({
**url: "/api/SomeController/" + id,**
type: "DELETE",
dataType: "json",
success: function(data, statusText) {
alert(data);
},
error: function(request, textStatus, error) {
alert(error);
debugger;
}
});
No use algo como esto:
...
data: {id:id}
...
como cuando usas el método POST
.
En algunos casos, eliminarlo solo de los módulos puede producir el siguiente error:
500.21 Handler "WebDAV" tiene un módulo malo "WebDAVModule" en su lista de módulos
Módulo: IIS Web Core Notification: ExecuteRequestHandler "
solución fue sugerida here . También es necesario eliminarlo de los controladores.
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
En mi caso, ninguna de las soluciones anteriores funcionaba. Esto fue porque había cambiado el nombre del parámetro en mi método Delete
.
tuve
public void Delete(string Questionid)
en lugar de
public void Delete(string id)
Necesito usar el nombre de id
porque ese es el nombre que se declara en mi archivo WebApiConfig
. Tenga en cuenta el nombre de id
en la tercera y cuarta líneas:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Tengo esta solución desde here .
Solo para agregar. Si esta es tu configuración
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }
por favor sigan haciendo lo que dijo Hugo, y no establezcan el atributo Ruta en el método de obtención del controlador, esto dio un problema en mi caso.
También tuve el mismo problema, estoy llamando a WebAPi y estoy obteniendo este error. Agregar la siguiente configuración en web.config para servicios resolvió mi problema
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/> <!-- add this -->
</modules>
en el archivo web.config resolvió mi problema. Así es como estaba llamando desde el lado del cliente
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(environment.ServiceUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
if (response.IsSuccessStatusCode)
{
string strResult = response.Content.ReadAsAsync<string>().Result;
}
}
Tenía el método de error 405 no permitido porque había omitido hacer público el método Delete en el controlador WebApi.
Me tomó mucho tiempo encontrar esto (¡demasiado!) Porque esperaba un error No Encontrado en este caso, por lo que asumí incorrectamente que se estaba rechazando mi método Eliminar.
El motivo de No permitido en lugar de No encontrado es que también tuve un método Obtener para la misma ruta (que será el caso normal al implementar REST). La función pública Get es igualada por el enrutamiento y luego denegada debido al método HTTP incorrecto.
Un error simple que conozco pero puede salvar a alguien más en algún momento.
Tuve el problema similar, pero para PUT, ninguna de las otras sugerencias funcionó para mí.
Sin embargo, estaba usando int
lugar de la string
predeterminada para el id. agregando {id:int}
a la ruta resolvió mi problema.
[Route("api/Project/{id:int}")]
public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
{
...
}
Tuvimos que agregar encabezados personalizados a nuestro web.config ya que nuestra solicitud tenía varios encabezados que confundían la respuesta de la API.
<httpProtocol>
<customHeaders>
<remove name="Access-Control-Allow-Methods" />
<remove name="Access-Control-Allow-Origin" />
<remove name="Access-Control-Allow-Headers" />
</customHeaders>
</httpProtocol>
Vaya al archivo applicationHost.config (generalmente en C: / Windows / System32 / inetsrv / config) y comente la siguiente línea en applicationHost.config
1) Bajo <controladores>:
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
2) Comente también el siguiente módulo al que hace referencia el controlador anterior en <modules>
<add name="WebDAVModule" />