Использование Ok вне ApiController, внутри ActionFilter - PullRequest
0 голосов
/ 09 марта 2020

Я использую фильтр действий для обработки исключений внутри моих ApiController методов.

Мои методы возвращают результаты как JSON, используя return Ok(object), однако, когда я хочу обработать исключения в моем фильтре действий для Обрабатывая исключение из моих методов ApiController, он не имеет доступа к методу Ok для сериализации объектов как JSON, поскольку это защищенный метод внутри ApiController. Вот пример моего фильтра действий:

public class WebServiceExceptionFilter : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        Exception exception = filterContext.Exception;
        if (exception is DbEntityValidationException)
        {
            List<string> errorMessageList = generateValidationErrorMessageList((DbEntityValidationException)e);
            string detailedError = String.Join(" ; ", errorMessageList);
            filterContext.Result = Ok(new WebServiceResult(ErrorCodes.ERROR_CODE_MINUS_3002_DB_VALIDATION, detailedError)); 
            //---------------------^^ Ok is not available ------
        }

    }
}

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Согласно исходному коду ControllerBase , возвращающий Ok результат из Controller просто возвращает OkObjectResult экземпляр.

[NonAction]
public virtual OkObjectResult Ok([ActionResultObjectValue] object value)
    => new OkObjectResult(value);

Таким образом, вы можете установить его непосредственно в filterContext.Result

var result = new WebServiceResult(ErrorCodes.ERROR_CODE_MINUS_3002_DB_VALIDATION, detailedError);
filterContext.Result = new OkObjectResult(result);
0 голосов
/ 09 марта 2020

Вы не можете использовать Ok, потому что это объект ControllerBase, и вы не можете использовать Controller в качестве базового класса для вашего ActionFilter. Что вы можете сделать, это установить код состояния вашего filterContext.HttpContext следующим образом:

filterContext.HttpContext.Response.StatusCode = exception.StatusCode;

или использовать собственный код состояния (например, 500) вместо исключения. StatusCode

...