Asp.net web api 获取HttpActionExecutedContext结果值

Asp.net web api 获取HttpActionExecutedContext结果值,asp.net-web-api,action-filter,Asp.net Web Api,Action Filter,我创建了一个筛选器,它继承asp.net Web api中的System.Web.Http.Filters.ActionFilterAttribute,并希望访问HttpActionExecutedContext结果对象中的一些数据 此对象在什么阶段/什么时候填充?正如我在重写OnActionExecuted方法及其始终为null时所看到的那样 有什么想法吗 编辑: 例如,在我的自定义过滤器中: public override OnActionExecuted(HttpActionExecute

我创建了一个筛选器,它继承asp.net Web api中的System.Web.Http.Filters.ActionFilterAttribute,并希望访问HttpActionExecutedContext结果对象中的一些数据

此对象在什么阶段/什么时候填充?正如我在重写OnActionExecuted方法及其始终为null时所看到的那样

有什么想法吗

编辑:

例如,在我的自定义过滤器中:

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

    base.OnActionExecuted(context);
}

最后在内容结果上使用了ReadAsStringAsync。
我试图在实际请求完成之前访问该属性。

虽然已授予的答案涉及ReadAsStringAsync,但答案没有示例。我听从了gdp的建议,得出了一个有点实际意义的例子

我创建了一个名为MessageInterceptor的类。我只是从ActionFilterAttribute派生,它在控制器获取webAPI方法调用之前和控制器完成之后立即开始拦截webAPI方法调用。这是我的最后一节课。本例使用XML序列化程序将请求和响应都转换为XML字符串。本例将请求和响应作为填充对象查找,这意味着反序列化已经发生。从填充的模型收集数据并序列化为XML字符串是请求和响应的表示,而不是IIS发送回的实际post请求和响应

代码示例-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;
        }
    }
}

使用此函数可以在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;
}

使用以下命令读取响应字符串:

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

分享一些代码。您使用的是beta版本还是源代码版本?这对我很有用。@Aliostad Hi我正在使用测试版。你用的是什么?我用的是相同的测试版。@Aliostad strange。当你说它对你有效时,你能再澄清一点吗,即使用system.web.http.filters等中相同的onactionexecuted事件。你不应该直接访问。结果,它阻塞了,你还想异步/等待ReadAsTringAsync.gdp-我不确定我是否理解你的评论“想Asnyc/等待ReadAsTringAsync”。OnActionExecuted在控制器启动并完成后发生。没有要阻止或等待的内容-整个响应都可用…如果已经从中读取了内容流,ReadAsStringAsync可能会返回“”。使用@virender的解决方案确保始终从位置0读取流。它适用于
HttpActionExecutedContext
,但是
System.Web.Mvc.ActionExecutedContext
有什么作用呢?