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;
}
}
The header values received during request is not available during this event.