Преобразование результатов действий веб-API

#asp.net-mvc #asp.net-web-api

#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 ActionResu<
    }
}
 

Ключевым моментом является то, что я хочу сделать это после выполнения моего действия, но до того, как результат будет преобразован в an HttpResponseMessage , чтобы мне не приходилось обрабатывать сериализацию.

Вот что я пробовал:

  • ActionFilterAttribute слишком поздно. Результатом уже является HttpResponseMessage .
  • Я не знаю, как вызывать действия из IHttpActionInvoker . Кроме того, я не хочу возвращать HttpResponseMessage .
  • ControllerActionInvoker кажется, нигде не дает мне ответа.

Из http://www.asp.net/posters/web-api/asp.net-web-api-poster-grayscale.pdf , похоже, я хочу что-то среднее между действием контроллера и OnActionExecuted.

Ответ №1:

Вы можете получить HttpContent вход HttpResponseMessage и проверить, является ли он ObjectContent внутри ActionFilterAttribute :

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

Это минимальный пример (с минимальной проверкой ошибок и очень ограниченным сценарием), но он должен направить вас на правильный путь, когда дело доходит до перехвата и перезаписи ответов с помощью фильтров действий.