HttpRequest: Ricavare valori presenti negli Headers

Di recente ho avuto la necessità -internamente ad una Azure Functions- di ricavare un valore che mi veniva fornito tramite la sezione Headers della chiamata HttpRequest. Secondo voi è fattibile questa operazione? Certamente!

Come? Ecco i dettagli nella prossima sezione del post …

StringValues

Come anticipavo in precedenza leggere i valori presenti all’interno di Header è davvero semplice. Per farlo non dovremo fare altro che utilizzare StringValues dopo avere aggiunto il namespace di appartenza tramite using

1
using Microsoft.Extensions.Primitives 

Arrivati a questo punto non dobbiamo fare altro che effettuare la ricerca per key tra i valori presenti all’interno del nostro Header.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public string GetHeaderValueByKey(HttpRequest req,string key)
{
    StringValues values = new StringValues();
    if (req.Headers.TryGetValue(key, out values))
    {
        var items = values
            .Where(x => string.IsNullOrEmpty(x) == false)
            .ToArray();

        return items.First();
    }

    return null;
}

Come avrete visto l’operazione da svolgere è veramente semplice. A questo punto potremmo avere due comportamenti (più uno) dal nostro codice:

  • Viene tornato il valore per KEY
  • Se viene tornato un null significa che non viene trovato nessun valore per la KEY di ricerca.

Ed il “comportamento più uno” a cosa corrisponde nello specifico e come si genera?

  • Viene trovato il valore per KEY
  • Verificando il valore con IsNullOrEmpty ricevo true
  • items non contiene elementi
  • Utilizzando .First() viene generata una Exception

Come fare? Qua la scelta è vostra.

  • Rimpiazzare .First() con FirstOrDefault()?
  • Effettuare la verifica di items con if (items.Length != 0)?

Nulla vieta di mandare in Exception il codice volutamente per poi gestire il tutto caso per caso. Nel mio caso specifico, la non presenza del valore richiedeva di sollevare una Exception (tracciata poi da Application Insights) per bloccare in maniera decisa l’esecuzione del codice.