我创建了一个过滤器,它继承了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);
}
答案 0 :(得分:7)
在内容结果上使用ReadAsStringAsync结束。 我试图在实际请求完成之前访问该属性。
答案 1 :(得分:5)
使用此功能在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;
}
答案 2 :(得分:2)
虽然获奖答案涉及ReadAsStringAsync,但答案没有例子。我遵循了gdp的建议,得出了一个有点工作的例子......
我创建了一个名为MessageInterceptor的类。我除了从ActionFilterAttribute派生之外什么都没做,它立即开始在控制器获取之前拦截webAPI方法调用,并在控制器完成之后。这是我的最后一堂课。此示例使用XML Serializer将请求和响应同时提供给XML字符串。此示例将请求和响应作为填充对象查找,这意味着已经发生了反序列化。从填充的模型收集数据并序列化为XML字符串是请求和响应的表示 - 而不是IIS发回的实际发布请求和响应。
代码示例 - 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;
}
}
}
答案 3 :(得分:0)
使用以下内容阅读响应字符串:
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;
}