在WebApi的ActionFilterAttribute的OnActionExecuted方法中修改HttpContent(actionExecutedContext.Response.Content)

时间:2013-05-22 09:30:04

标签: asp.net-mvc asp.net-web-api

我的WebApi操作方法返回IQueryable,我想通过Asp.Net WebApi(非MVC)中的ActionFilterAttribute修改它(应用分页和过滤)。 我得到了以下线程如何访问传递的模型:

.Net Web API IActionFilter.OnActionExecuted return type

但是如何用其他东西更改/替换整个模型?

1 个答案:

答案 0 :(得分:12)

我找到了它!

首先我应该将actionExecutedContext.ActionContext.Response.Content投射到ObjectContent(您应该对项目中的System.Net.Http.Formatting.dll文件有所了解)

之后您可以简单地执行以下操作:

public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
    IEnumerable model = null;
    actionExecutedContext.Response.TryGetContentValue(out model);
    if (model != null)
    {
        IQueryable modelQuery = model.AsQueryable();

        //Do your modelQuery modification/replacement

        (actionExecutedContext.ActionContext.Response.Content as ObjectContent).Value = modelQuery;
    }

    base.OnActionExecuted(actionExecutedContext);
}

注意:要使用TryGetContentValue方法,您需要导入using System.Net.Http;命名空间,尽管在上述代码中调用此方法并不重要。

:: UPDATE ::

如果您需要更改内容的值类型(例如,返回字符串而不是IQueryable),则无法更改该值。你应该创建一个这样的新内容:

var result = "Something new!";
var oldObjectContent = (actionExecutedContext.ActionContext.Response.Content as ObjectContent);
var newContent = new ObjectContent<string>(result, oldObjectContent.Formatter);
actionExecutedContext.ActionContext.Response.Content = newContent;