Как использовать OnExceptionAspect для возврата ActionResult - PullRequest
1 голос
/ 08 марта 2019

У меня есть простое ApiController, которое я пытаюсь отловить и вернуть ошибку.Это было для быстрой OnExceptionAspect демонстрации, но я столкнулся с загадкой: я не могу понять, как вернуть BadRequest как args.ReturnValue.Я думал, что это будет проще, чем это.Я впервые использую PostSharp за очень долгое время и, конечно, впервые при использовании ASP.Net Core.

Примечание: у меня неверная строка соединения в контексте, чтобы вызвать быструю ошибку (не показана).

ParentController

[HttpGet("Get/{studentId}")]
[ActionResultExceptionAspect(StatusCode = HttpStatusCode.BadRequest)]
public ActionResult<IEnumerable<ParentModel>> RetrieveParents(string studentId)
{
    var query = Context.ParentViews
        .Where(x => x.StudentID == studentId)
        .Select(s => EntityMapper.MapFromEntity(s));

    return query.ToArray();
}

ActionResultExceptionAspect

public override void OnException(MethodExecutionArgs args)
{
    args.FlowBehavior = FlowBehavior.Return;
    args.ReturnValue = ((StudentControllerBase)args.Instance).BadRequest();
}

Я получаю ошибку:

System.InvalidCastException: Unable to cast object of type 'Microsoft.AspNetCore.Mvc.BadRequestResult' to type 'Microsoft.AspNetCore.Mvc.ActionResult`1[System.Collections.Generic.IEnumerable`1[Student.Models.ParentModel]]'.

1 Ответ

1 голос
/ 11 марта 2019

Кажется, проблема связана с экземпляром.Я вижу множество решений, которые кажутся чрезмерно сложными для того, что мне нужно, поэтому я решил найти самый простой способ решить эту проблему, пока не смог найти что-то лучшее.Я видел это как проблему, специфичную для ActionResult<T> возвращаемых типов всякий раз, когда генерируется вне экземпляра.Это кажется простым с обобщениями для целей модульных тестов, но так как это время выполнения и трудно разрешить неизвестный тип возврата, я пошел с Activator.CreateInstance

Мой новый метод OnException:

public override void OnException(MethodExecutionArgs args)
{
    var methType = ((MethodInfo)args.Method).ReturnType;

    args.ReturnValue = Activator.CreateInstance(methType, ((ControllerBase)args.Instance).BadRequest());
    args.FlowBehavior = FlowBehavior.Return;
}

Я ни в коем случае не уверен, что это правильный способ сделать это, но он работает для этого случая.

...