How to get “Query String”, “Headers” and “Body” from HttpActionExecutedContext

by Virender
September 8, 2015
In Web API for Exception Handling we use ExceptionFilter to override OnException event of ExceptionFilterAttribute class. We need to use HttpActionExecutedContext to get current context of application.

In some time we need “Query String”, “Headers” and “Body” from HttpActionExecutedContext. Query String and Headers easily accessible from HttpActionExecutedContext .
But Body is not easily accessible you need to use context.Request.ReadAsStringAsync() and reset the position in the stream to zero and then try to access it.

I am giving code snippet for these

01
02
03
04
05
06
07
08
09
10
11
public class ExceptionFilter: ExceptionFilterAttribute {
  public override void OnException(HttpActionExecutedContext context) {
      WebAPIRequestHelper request = new WebAPIRequestHelper();
      var requestQueryString = request.GetQueryStringFromRequest(context);
      var requestBody = request.GetBodyFromRequest(context);
      var requestHeaders = request.GetHeadersFromRequest(context);
  }
}
public class ExceptionFilter: ExceptionFilterAttribute {

public override void OnException(HttpActionExecutedContext context) {
WebAPIRequestHelper request = new WebAPIRequestHelper();

var requestQueryString = request.GetQueryStringFromRequest(context);
var requestBody = request.GetBodyFromRequest(context);
var requestHeaders = request.GetHeadersFromRequest(context);
}

}

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//WebAPI Request Helper class is use to get "Query String","Headers" and "Body" from HttpActionExecutedContext
 
public class WebAPIRequestHelper {
    public object GetQueryStringFromRequest(HttpActionExecutedContext context) {
        var queryStringList = new List < KeyValuePair < string,
            string >> ();
 
        if (context.Request.RequestUri != null) {
            var queryCollection = context.Request.RequestUri.Query.Substring(1).Split('&');
 
            foreach(var item in queryCollection) {
                var itm = item.Split('=');
                var queryString = new KeyValuePair < string,
                    string > (itm[0], itm[1]);
                queryStringList.Add(queryString);
            }
        }
 
        return queryStringList;
    }
 
    public List < KeyValuePair < string, string >> GetHeadersFromRequest(HttpActionExecutedContext context) {
        var headersList = new List < KeyValuePair < string,
            string >> ();
 
        foreach(var header in context.Request.Headers) {
            headersList.Add(new KeyValuePair < string, string > (header.Key, ((string[])(header.Value))[0]));
        }
 
        return headersList;
    }
    public string GetBodyFromRequest(HttpActionExecutedContext context) {
        string data;
        using(var stream = context.Request.Content.ReadAsStreamAsync().Result) {
            if (stream.CanSeek) {
                stream.Position = 0;
            }
            data = context.Request.Content.ReadAsStringAsync().Result;
        }
        return data;
    }
}
 

//WebAPI Request Helper class is use to get "Query String","Headers" and "Body" from HttpActionExecutedContext

public class WebAPIRequestHelper {
public object GetQueryStringFromRequest(HttpActionExecutedContext context) {
var queryStringList = new List < KeyValuePair < string,
string >> ();

if (context.Request.RequestUri != null) {
var queryCollection = context.Request.RequestUri.Query.Substring(1).Split('&');

foreach(var item in queryCollection) {
var itm = item.Split('=');
var queryString = new KeyValuePair < string,
string > (itm[0], itm[1]);
queryStringList.Add(queryString);
}
}

return queryStringList;
}

public List < KeyValuePair < string, string >> GetHeadersFromRequest(HttpActionExecutedContext context) {
var headersList = new List < KeyValuePair < string,
string >> ();

foreach(var header in context.Request.Headers) {
headersList.Add(new KeyValuePair < string, string > (header.Key, ((string[])(header.Value))[0]));
}

return headersList;
}
public string GetBodyFromRequest(HttpActionExecutedContext context) {
string data;
using(var stream = context.Request.Content.ReadAsStreamAsync().Result) {
if (stream.CanSeek) {
stream.Position = 0;
}
data = context.Request.Content.ReadAsStringAsync().Result;
}
return data;
}
}


Share:

Tags:

0 0 votes
Article Rating
Subscribe
Notify of
guest
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Unknown
4 years ago

The header values received during request is not available during this event.

Related posts