#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" });
}
}
}
Это минимальный пример (с минимальной проверкой ошибок и очень ограниченным сценарием), но он должен направить вас на правильный путь, когда дело доходит до перехвата и перезаписи ответов с помощью фильтров действий.