我有一个奇怪的问题,来自Dapper的DataExceptions
没有正确地进行properagte。
public class CustomerController : Controller
{
private readonly IMediator _mediator;
public CustomerController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet]
public async Task<IActionResult> Get(Get.Query query)
{
var result = await _mediator.Send(query);
return Ok(result);
}
}
public class Get
{
public class Query : IRequest<IEnumerable<Result>>
{
}
public class Result
{
public Guid Id { get; set; }
public string Name { get; set; }
}
public class QueryHandler : IAsyncRequestHandler<Query, IEnumerable<Result>>
{
private readonly IDbConnection _dapper;
public QueryHandler(IDbConnection dapper)
{
_dapper = dapper;
}
public async Task<IEnumerable<Result>> Handle(Query message)
{
// the below throws because of incorrect type mapping
// (yes, the connection is open)
var customers =
await _dapper.Connection.QueryAsync<Result>("SELECT Id, Name FROM [Customer].[Customers]");
return customers;
}
}
}
卷曲
curl -X GET'http :// localhost:5000 / api / Customer '
请求网址
HTTP://本地主机/ API /客户
响应机构
无内容
响应代码
500
我期待500错误描述,而不是没有内容 。
这是抛出的异常:
如果我将Handle
方法更改为:
public async Task<IEnumerable<Result>> Handle(Query message)
{
throw new DataException("What is going on?");
}
我得到了预期的结果。一个500,错误地说“发生了什么事?”
因为我有app.UseDeveloperExceptionPage();
启用它看起来像这样。
An unhandled exception occurred while processing the request. DataException: What is going on? ...Customer.Get+QueryHandler+<Handle>d__2.MoveNext() in Get.cs, line 42 Stack Query Cookies Headers DataException: What is going on? ...
但那是预期的。
那么发生了什么?为什么Dapper的DataException
不能按预期工作?
MediatR
的预处理器在AggregateException
中AggregateException
来自管道的所有异常。
您必须公开它 - 例如使用ExceptionFilterAttribute
:
public class MyExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
Exception exception = context.Exception;
if (exception is AggregateException
&& exception.InnerException != null)
{
exception = exception.InnerException;
}
// check type and do you stuff ........
context.Response = new HttpResponseMessage
{
Content = this.CreateContent(response),
StatusCode = HttpStatusCode.BadRequest
};
//....