如何在框架格式化之前转换控制器操作的结果?
假设我有一个像:
这样的控制器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之间的东西。
答案 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" });
}
}
}
这是一个最小的例子(最少的错误检查和非常有限的情况)但是它应该让你在使用动作过滤器拦截和重写响应时开始正确的道路。