【发布时间】:2019-06-06 00:40:46
【问题描述】:
我使用中间件捕获请求异常并像这样写响应
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await next(context);
}
catch (Exception ex)
{
logger.LogError(ex.Message);
await HandleExceptionAsync(context, ex); //write response
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception exception)
{
FanjiaApiResultMessage resultMessage = new FanjiaApiResultMessage()
{
ResultCode = -1,
Data = null,
Msg = exception.Message
};
string result = JsonConvert.SerializeObject(resultMessage);
context.Response.ContentType = "application/json;charset=utf-8";
if (exception is QunarException)
{
context.Response.StatusCode = (int)(exception as QunarException).httpStatusCode;
}
else
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
return context.Response.WriteAsync(result);
}
这样的请求模型参数
public class FlightModel {
[JsonProperty("depCity", Required = Required.Always)]
public string DepCity { get; set; }
}
public IActionResult Test(FlightModel model){
return Content("test");
}
当我发布没有 DepCity 的 FlightModel 时,我会得到异常
{
"errors": {
"": [
"Required property 'depCity' not found in JSON. Path '', line 6, position 1."
]
},
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "8000000a-0003-ff00-b63f-84710c7967bb"
}
显然异常没有被中间件捕获。
为什么中间件没有被捕获?
【问题讨论】:
-
你能告诉我们你的
Configuration.cs吗?我有一种感觉,您可能没有正确订购它以使您的中间件首先在请求管道上命中。 -
@Svek 感谢您的回复。我把它放在 app.UseMvc(); 前面我认为 Simon C 是对的,这很有用
标签: c# asp.net-core json.net