gdp
gdp

Reputation: 8242

Getting the HttpActionExecutedContext Result values

I have created a filter which inherits the System.Web.Http.Filters.ActionFilterAttribute in the asp.net web api and would like to access some of the data inside the HttpActionExecutedContext result object.

At what stage/when does this object get populated? As I looked at it when overriding the OnActionExecuted method and its always null?

Any ideas?

Edit:

for example here in my custom filter:

public override OnActionExecuted(HttpActionExecutedContext context)
{
    //context.Result.Content is always null

    base.OnActionExecuted(context);
}

Upvotes: 13

Views: 19610

Answers (4)

Kumar Lachhani
Kumar Lachhani

Reputation: 218

Use below to read Response string:

    public static string GetResponseContent(HttpResponseMessage Response)
    {
        string rawResponse = string.Empty;
        try
        {
            using (var stream = new StreamReader(Response.Content.ReadAsStreamAsync().Result))
            {
                stream.BaseStream.Position = 0;
                rawResponse = stream.ReadToEnd();
            }
        }
        catch (Exception ex) { throw; }
        return rawResponse;
    }

Upvotes: 0

virender
virender

Reputation: 4647

Use this function to get body of request in web api

private 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;
}

Upvotes: 8

barrypicker
barrypicker

Reputation: 10088

While the awarded answer referred to ReadAsStringAsync, the answer had no example. I followed the advice from gdp and derived a somewhat working example...

I created a single class called MessageInterceptor. I did nothing more than derive from ActionFilterAttribute and it immediately started to intercept webAPI method calls prior to the controller getting it, and after the controller finished. Here is my final class. This example uses the XML Serializer to get both the request and response into an XML string. This example finds the request and response as populated objects, this means deserialization has already occurred. Collecting the data from a populated model and serializing into an XML string is a representation of the request and response - not the actual post request and response sent back by IIS.

Code example - MessageInterceptor

using System.IO;
using System.Linq;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Xml.Serialization;

namespace webapi_test
{
    public class MessageInterceptor : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            base.OnActionExecuting(actionContext);
            var headers = actionContext.Request.Content.Headers.ToString();
            var request = actionContext.ActionArguments.FirstOrDefault().Value;
            var xml = SerializeXMLSerializer(request, "");
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            base.OnActionExecuted(actionExecutedContext);
            var headers = actionExecutedContext.Response.Content.Headers.ToString();
            var response = actionExecutedContext.Response.Content.ReadAsStringAsync().Result;
            var xml = SerializeXMLSerializer(response, "");
        }

        public static string SerializeXMLSerializer(object o, string nameSpace)
        {
            string serializedValue;
            var writer = new StringWriter();
            XmlSerializer serializer = new XmlSerializer(o.GetType(), nameSpace);
            serializer.Serialize(writer, o);
            serializedValue = writer.ToString();
            return serializedValue;
        }
    }
}

Upvotes: 3

gdp
gdp

Reputation: 8242

Ended up using ReadAsStringAsync on the content result. I was trying to access the property before the actual request had finished.

Upvotes: 7

Related Questions