转换Web API操作的结果

时间:2014-06-27 15:54:42

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

如何在框架格式化之前转换控制器操作的结果?

假设我有一个像:

这样的控制器
public class Controller : System.Web.Http.ApiController {
    public object GetSomething() {
        return new { value = "something" };
    }
}

我希望能够构建这样的东西:

public class ActionResultFilter {
    public object InvokeAction(Action Action) {
        object ActionResult = Action.Invoke();
        if (ActionResult == null) {
            return new { value = "nothing" };
        }
        return ActionResult;
    }
}

关键是我想在执行操作后执行此操作,但在将结果转换为HttpResponseMessage之前,我不需要处理序列化。

这是我尝试过的:

  • ActionFilterAttribute为时已晚。结果已经是HttpResponseMessage
  • 我不知道如何从IHttpActionInvoker调用操作。另外,我不想退回HttpResponseMessage
  • ControllerActionInvoker似乎无法在任何地方给我回复。

http://www.asp.net/posters/web-api/asp.net-web-api-poster-grayscale.pdf开始,看起来我想要一些控制器动作和OnActionExecuted之间的东西。

1 个答案:

答案 0 :(得分:2)

您可以在HttpContent中获取HttpResponseMessage并检查ObjectContent中的ActionFilterAttribute是否为{{3}}:

public class YourFilterNameAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext context)
    {
        var objectContent = context.Response.Content as ObjectContent
        if(objectContent != null && objectContent.Value == null) 
        {
            context.Response = context.Request
                                      .CreateResponse(HttpStatusCode.NotFound, 
                                                      new { value = "nothing" });
        }
    }
}

这是一个最小的例子(最少的错误检查和非常有限的情况)但是它应该让你在使用动作过滤器拦截和重写响应时开始正确的道路。