为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 OnExceptionAspect 返回 ActionResult<IEnumerable

如何使用 OnExceptionAspect 返回 ActionResult<IEnumerable

C#
汪汪一只猫 2022-10-15 14:58:45
我有一个简单ApiController的尝试捕获并返回错误。这是一个快速OnExceptionAspect演示,但我遇到了一个障碍:我不知道如何BadRequest以args.ReturnValue. 我认为它会比这更简单。这是我很长一段时间以来第一次使用 PostSharp,当然也是第一次使用 ASP.Net Core。注意:我在上下文中有一个错误的连接字符串来强制快速错误(未显示)。父控制器[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();}ActionResultExceptionAspectpublic 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 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

该问题似乎是基于实例的问题。我看到很多解决方案对于我需要的东西来说似乎过于复杂,所以我用最简单的方法来解决这个问题,直到找到更好的解决方案。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;

}

我绝不确定这是正确的方法,但它适用于这种情况。


查看完整回答
反对 回复 2022-10-15
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信