Consentire il metodo DELETE tramite firewall WEB API 2

1

Sto lavorando con un servizio Web API 2 di ASP.Net e il firewall nega il passaggio del metodo DELETE (sono consentiti solo POST e GET).

C'è un modo per aggirarlo e invocare il mio metodo DELETE nell'API?

    
posta Gerome Lucus 20.01.2017 - 00:58
fonte

2 risposte

2

Se è bloccato prima che arrivi all'applicazione, allora no. Se l'applicazione non può vederlo, l'applicazione non può fare nulla per consentirlo.

Quello che puoi fare è hackerarlo. Il modo più comune per implementare i verbi bloccati o comunemente bloccati come DELETE e PUT è aggiungere l'intestazione X-Http-Method-Override alle tue richieste e impostare il valore per il verbo che vuoi veramente usare, ma usa POST come verbo HTTP per la richiesta. Quindi puoi creare un DelegatingHandler che cerca quell'intestazione dopo che la richiesta è entrata nella pipeline di WebApi, e se esiste, puoi cambiare l'HttpMethod della richiesta effettiva da POST a DELETE in quel punto.

    
risposta data 20.01.2017 - 01:51
fonte
1

Se avessi chiarito la tua domanda, puoi ottenere ciò che stai cercando usando il metodo di sovrascrittura. Tutto quello che devi fare è aggiungere la seguente voce nell'intestazione della richiesta

X-HTTP-Method-Override : DELETE

Quindi fai una richiesta POST alla tua risorsa.

Nel server WEB API, è necessario gestire questo metodo eseguendo l'override utilizzando DelegatingHandler. Quindi è necessario analizzare qual è il valore nell'attributo X-HTTP-Method-Override ed eseguire di conseguenza l'operazione effettiva.

Di seguito è riportato un codice di esempio

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);
    }
}
    
risposta data 20.01.2017 - 01:59
fonte

Leggi altre domande sui tag