【问题标题】:Modify HttpContent (actionExecutedContext.Response.Content) in OnActionExecuted method of WebApi's ActionFilterAttribute修改WebApi的ActionFilterAttribute的OnActionExecuted方法中的HttpContent(actionExecutedContext.Response.Content)
【发布时间】:2013-05-17 07:07:53
【问题描述】:

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

.Net Web API IActionFilter.OnActionExecuted return type

但是我怎样才能用其他东西改变/替换整个模型呢?

【问题讨论】:

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


    【解决方案1】:

    我找到了!

    首先我应该将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;命名空间,虽然在上面的代码中调用这个方法并不重要。

    :: 更新 ::

    如果您需要更改内容的值类型(例如返回字符串而不是 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 2023-03-19
      • 2012-09-11
      • 1970-01-01
      相关资源
      最近更新 更多