Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting a Request.Headers value

Very simple I'm sure, but driving me up the wall! There is a component that I use in my web application that identifies itself during a web request by adding the header "XYZComponent=true" - the problem I'm having is, how do you check for this in your view?

The following wont work:

if (Request.Headers["XYZComponent"].Count() > 0) 

Nor this:

if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0) 

Both throw exceptions if the header variable has not been set. Any help would be most appreciated.

like image 667
Jimbo Avatar asked Aug 20 '10 10:08

Jimbo


People also ask

How do you find the value of headers?

get() The get() method of the Headers interface returns a byte string of all the values of a header within a Headers object with a given name. If the requested header doesn't exist in the Headers object, it returns null .

How do I read request headers?

Reading Request Headers from Servlets Reading headers is very straightforward; just call the getHeader method of the HttpServletRequest , which returns a String if the header was supplied on this request, null otherwise.

How do I read header values in Web API?

As shown above, the header value can be easily read through the HttpContext object. Please add below generic logic to read through any of the custom headers. HttpContext will be accessible through the WebAPI pipeline and can be available through middleware (as shown in the above example) or .


2 Answers

if (Request.Headers["XYZComponent"].Count() > 0) 

... will attempted to count the number of characters in the returned string, but if the header doesn't exist it will return NULL, hence why it's throwing an exception. Your second example effectively does the same thing, it will search through the collection of Headers and return NULL if it doesn't exist, which you then attempt to count the number of characters on:

Use this instead:

if(Request.Headers["XYZComponent"] != null) 

Or if you want to treat blank or empty strings as not set then use:

if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0) 

The Null Coalesce operator ?? will return a blank string if the header is null, stopping it throwing a NullReferenceException.

A variation of your second attempt will also work:

if (Request.Headers.AllKeys.Any(k => string.Equals(k, "XYZComponent"))) 

Edit: Sorry didn't realise you were explicitly checking for the value true:

bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet; 

Will return false if Header value is false, or if Header has not been set or if Header is any other value other than true or false. Will return true is the Header value is the string 'true'

like image 55
Sunday Ironfoot Avatar answered Sep 22 '22 18:09

Sunday Ironfoot


Header exists:

if (Request.Headers["XYZComponent"] != null) 

or even better:

string xyzHeader = Request.Headers["XYZComponent"]; bool isXYZ;  if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ) 

which will check whether it is set to true. This should be fool-proof because it does not care on leading/trailing whitespace and is case-insensitive (bool.TryParse does work on null)

Addon: You could make this more simple with this extension method which returns a nullable boolean. It should work on both invalid input and null.

public static bool? ToBoolean(this string s) {     bool result;      if (bool.TryParse(s, out result))         return result;     else         return null; } 

Usage (because this is an extension method and not instance method this will not throw an exception on null - it may be confusing, though):

if (Request.Headers["XYZComponent"].ToBoolean() == true) 
like image 21
Lasse Espeholt Avatar answered Sep 22 '22 18:09

Lasse Espeholt