如何使用OnExceptionAspect返回ActionResult <ienumerable <model >>

时间:2019-03-07 21:37:02

标签: c# .net-core postsharp asp.net-apicontroller

我有一个简单的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 个答案:

答案 0 :(得分:1)

该问题似乎是基于实例的问题。我看到许多解决方案似乎对我所需的解决方案来说过于复杂,因此我以最简单的方法来解决此问题,直到找到更好的解决方案为止。我已经将其视为在实例外部生成的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;
}

我绝不能确定这是正确的方法,但是它适用于此实例。