2015-10-19 15 views
5

Sto tentando di rimuovere l'intestazione Set-Cookie specifica da HttpResponseHeaders nel metodo OnActionExecuted di ActionFilter.Un modo per rimuovere cookie specifici da HttpRequestHeaders in WebApi

Sto avendo alcuni problemi con quella:

  1. non riesco a vedere il modo di intestazioni di enumerare. La collezione è sempre vuota, anche se vedo le intestazioni nel debugger.
  2. Perché non riesco a enumerare , non riesco a rimuovere l'intestazione specifica. Posso rimuovere tutte le intestazioni con la stessa chiave, ma Set-Cookie può avere più voci .

Attualmente sto rimuovendo tutti i cookie, ma questo non è quello che voglio.

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
{     
    HttpResponseHeaders headers = actionExecutedContext.Response.Headers; 
    IEnumerable<string> values; 
    if (headers.TryGetValues("Set-Cookie", out values)) 
    { 
     actionExecutedContext.Response.Headers.Remove("Set-Cookie"); 
    } 

    base.OnActionExecuted(actionExecutedContext); 
} 

risposta

4

Dal link:

Non è possibile cancellare direttamente un cookie sul computer di un utente. Tuttavia, è possibile indirizzare il browser dell'utente per eliminare il cookie impostando la data di scadenza del cookie su una data passata. La prossima volta che un utente effettua una richiesta a una pagina all'interno del dominio o percorso che imposta il cookie, il browser determinerà che il cookie è scaduto e lo rimuove.

Così, come rimuovere/cancellare i cookie nel Web ASP.NET Api a livello di filtro azione, basta provare a impostare la data di scadenza dei cookie per una data passata:

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
{ 
    var response = actionExecutedContext.Response; 
    var request = actionExecutedContext.Request; 

    var currentCookie = request.Headers.GetCookies("yourCookieName").FirstOrDefault(); 
    if (currentCookie != null) 
    { 
     var cookie = new CookieHeaderValue("yourCookieName", "") 
     { 
      Expires = DateTimeOffset.Now.AddDays(-1), 
      Domain = currentCookie.Domain, 
      Path = currentCookie.Path 
     }; 

     response.Headers.AddCookies(new[] { cookie }); 
    } 

    base.OnActionExecuted(actionExecutedContext); 
} 
+0

io non voglio cancella cookie sul computer dell'utente. Semplicemente non voglio mandare i cookie all'utente in Web-Api, per impedire la scadenza di scorrimento su alcune azioni del web-api. Quindi voglio rimuovere l'intestazione Set-Cookie specifica. – Marcin

+0

Ok, allora sono solo curioso di sapere perché devi fare questo @Marcin? –

+0

Possiedo un'app Web con utilizzo interno di Web API. Viene utilizzato per semplificare la richiesta e ottenere la responsabilità del formato restituito su javascript, ecc. Poiché sto utilizzando l'autenticazione basata su form, il cookie viene inviato dopo un po 'di tempo per estendere il tempo di scadenza. Ci sono poche azioni nella mia app, che vengono chiamate in background, automaticamente. Quindi voglio impedire loro di estendere la scadenza del cookie di autenticazione. – Marcin