我如何使用 OnExceptionAspect 来 return ActionResult<IEnumerable<Model>>
How do I use OnExceptionAspect to return ActionResult<IEnumerable<Model>>
我有一个简单的 ApiController
试图捕获 return 一个错误。这是为了快速 OnExceptionAspect
演示,但我 运行 遇到了麻烦:我不知道如何 return 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();
}
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]]'.
这个问题似乎是一个基于实例的问题。我看到很多解决方案对于我需要的东西来说似乎过于复杂,所以我采用了最简单的方法来解决这个问题,直到找到更好的方法。无论何时在实例外部生成,我都将此视为特定于 ActionResult<T>
return 类型的问题。出于单元测试的目的,这对于泛型来说似乎很简单,但由于这是运行时并且很难解析未知的 return 类型,所以我选择了 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;
}
我不确定这是正确的方法,但它适用于此实例。
我有一个简单的 ApiController
试图捕获 return 一个错误。这是为了快速 OnExceptionAspect
演示,但我 运行 遇到了麻烦:我不知道如何 return 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();
}
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]]'.
这个问题似乎是一个基于实例的问题。我看到很多解决方案对于我需要的东西来说似乎过于复杂,所以我采用了最简单的方法来解决这个问题,直到找到更好的方法。无论何时在实例外部生成,我都将此视为特定于 ActionResult<T>
return 类型的问题。出于单元测试的目的,这对于泛型来说似乎很简单,但由于这是运行时并且很难解析未知的 return 类型,所以我选择了 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;
}
我不确定这是正确的方法,但它适用于此实例。