Web Api - как остановить веб-конвейер напрямую из фильтра OnActionExecuting

У меня есть pre-action web api hook, который будет проверять ModelState.IsValid. Если ModelState недействителен, я не хочу выполнять действие и просто немедленно возвращаю свое сообщение. Как именно я это делаю?

public class ValidateModelStateAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) {
        if (!actionContext.ModelState.IsValid)
        {
            var msg = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
            // Now What?
        }
        base.OnActionExecuting(actionContext);
    }
}

Ответы на вопрос(3)

Вы действительно видели пример на странице ASP.NET WebApi?

Очень похоже на то, что тымы пытаемся достичь, и все, что они делают, это устанавливают Response объекта Context:

If model validation fails, this filter returns an HTTP response that contains the validation errors. In that case, the controller action is not invoked.

http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

увидеть:Handling Validation Errors

 George Mauer29 мая 2013 г., 23:48
ах, нет, я не видел этого. Благодарю.
Решение Вопроса

установить Response.Result. Если результат не нулевой, он не выполнит действие. точный синтаксис ускользает от меня прямо сейчас, но этотак просто, как

if(actionContext.ModelState.IsValid == false)
{
       var response = actionContext.Request.CreateErrorResponse(...);
       actionContext.Response = response;
}   
 joedotnot23 янв. 2019 г., 07:55
между прочим .. просто интересно, какова цель вызова базы .. когда мы должны вызывать базу .. а когда нет?
 Jason Meckley30 мая 2013 г., 02:17
да, вы можете позвонитьbase
 George Mauer29 мая 2013 г., 21:42
Я вижу, я тогда называю базу или нет? То, что я действительно хотел бы, чтобы все фильтры перед действием запускались, но не само действие. Таким образом, все фильтры журналов все равно будут работать

Я предполагаю, что вы должны бросить HttpResponseException

 Darrel Miller29 мая 2013 г., 22:28
@ GeorgeMauer Это будет работать для ActionFilters, не уверен насчет AuthorizationFilters. Как Джоанна упомянула, очевидно, вы можете просто установить Ответ. Вау, я действительно ненавижу ActionFilters, так много сложностей без причины.
 Darrel Miller30 мая 2013 г., 20:54
@ GeorgeMauer Я использую MessageHandlers для большинства моих сквозных задач. Что касается конкретных действий, то какая разница между добавлением атрибута Authorize и вызовом Authorize () в самом действии? По крайней мере, при прямом звонке я точно знаю, когда это произойдет.
 George Mauer30 мая 2013 г., 22:32
Мне нужно посмотреть на MessageHandlers - как и на другой - разница в том, что фильтры можно добавлять глобально и быть частью вашей инфраструктуры.
 George Mauer29 мая 2013 г., 21:37
Вы думаете, что это будет работать так же, как просто вернуть сообщение? Не в состоянии компиляции, поэтому я могуНе проверяйте atm, но кажется странным выдавать исключения для проблем проверки.
 George Mauer30 мая 2013 г., 18:58
Что вы имеете в виду? Как еще вы делаете сквозные проблемы? Использование базовых классов для этого обычно превращается в огромный негибкий беспорядок, когда вы получаете достаточно сквозных вопросов. Единственный другой вариант - это что-то вроде PostSharp, у которого есть свои проблемы.
 Darrel Miller30 мая 2013 г., 23:14
@ GeorgeMauer Все, что я хочу сделать в глобальном масштабе, я делаю с MessageHandlers.

Ваш ответ на вопрос