Estoy trabajando con un servicio de ASP.Net Web API 2 y el firewall niega el método DELETE (solo se permiten POST y GET).
¿Hay alguna forma de evitar esto e invocar mi método DELETE en la API?
Estoy trabajando con un servicio de ASP.Net Web API 2 y el firewall niega el método DELETE (solo se permiten POST y GET).
¿Hay alguna forma de evitar esto e invocar mi método DELETE en la API?
Si está bloqueado antes de que llegue a la aplicación, entonces no. Si la aplicación no puede verla, la aplicación no puede hacer nada para permitirla.
Lo que puedes hacer es hackearlo. La forma más común de implementar verbos que están bloqueados, o comúnmente están bloqueados como DELETE y PUT es agregar el encabezado X-Http-Method-Override a sus solicitudes, y establecer el valor para el verbo que realmente desea usar, pero use POST como el verbo HTTP para la solicitud. Luego, puede crear un DelegatingHandler que busque ese encabezado después de que la solicitud haya ingresado en la canalización de WebApi, y si existe, puede cambiar el HttpMethod real de la solicitud de POST a SUPRIMIR en ese momento.
Si me aclaro la pregunta, puede lograr lo que está buscando usando el método de anulación. Todo lo que necesita hacer es agregar la siguiente entrada en el encabezado de la solicitud
X-HTTP-Method-Override : DELETE
Luego haga una solicitud POST a su recurso.
En el extremo del servidor de API WEB, debe manejar este método que reemplaza usando DelegatingHandler. Luego, debe analizar cuál es el valor en el atributo X-HTTP-Method-Override y realizar su operación real en consecuencia.
A continuación se muestra un código de ejemplo
public class MethodOverrideHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
if (request.Method == HttpMethod.Post && request.Headers.Contains("X-HTTP-Method-Override"))
{
var method = request.Headers.GetValues("X-HTTP-Method-Override").FirstOrDefault();
bool isDelete = String.Equals(method, "DELETE", StringComparison.OrdinalIgnoreCase);
if (isDelete)
{
request.Method = new HttpMethod(method);
}
}
return await base.SendAsync(request, cancellationToken);
}
}