C# 在使用Linux Docker容器部署ASP.NET Core 5应用程序时,如何使用异常筛选器处理错误?
我的应用程序中有一个异常过滤器——一种用于处理系统中发生的所有异常的机制。此处给出了此类过滤器的定义:C# 在使用Linux Docker容器部署ASP.NET Core 5应用程序时,如何使用异常筛选器处理错误?,c#,asp.net,docker,C#,Asp.net,Docker,我的应用程序中有一个异常过滤器——一种用于处理系统中发生的所有异常的机制。此处给出了此类过滤器的定义: public sealed class ExceptionFilter : ExceptionFilterAttribute { private const string ResponseContentType = "application/json"; public override void OnException(ExceptionContext e
public sealed class ExceptionFilter : ExceptionFilterAttribute
{
private const string ResponseContentType = "application/json";
public override void OnException(ExceptionContext exceptionContext)
{
var response = exceptionContext.HttpContext.Response;
var message = exceptionContext.Exception.Message;
var statusCode = FindCorrespondingStatusCode(exceptionContext.Exception);
CreateResponseAsync(response, message, statusCode).Wait();
}
private static async Task CreateResponseAsync(HttpResponse response,
string errorMessage,
HttpStatusCode statusCode)
{
var result = JsonConvert.SerializeObject(
new
{
Message = errorMessage,
StatusCode = (int) statusCode,
});
response.StatusCode = (int) statusCode;
response.ContentType = ResponseContentType;
await response.WriteAsync(result);
}
private static HttpStatusCode FindCorrespondingStatusCode(Exception exception) =>
exception switch
{
ArgumentNullException _ => HttpStatusCode.NotFound,
NullReferenceException _ => HttpStatusCode.NotFound,
UnauthorizedAccessException _ => HttpStatusCode.Unauthorized,
_ => HttpStatusCode.InternalServerError
};
}
当应用程序中发生任何异常时,由于ExceptionFilter,我可以始终依靠消息字段中带有异常描述的准备好的响应。如果将应用程序与IIS/IIS Express一起使用,则此解决方案有效。My api返回正确的消息,例如,如果用户尝试使用无效密码注册,My web api将返回以下响应:
{
"Message": "Password must be at least 8 characters long, must contain a digit, a capital english letter, lower case english letter, and one special character",
"StatusCode": 500
}
问题是,当我尝试在Docker容器上运行我的应用程序时,它使用Kestrel服务器而不是IIS。如果发生任何异常,api只返回空响应,因此该机制由于某种原因无法工作,我想这是因为我使用Kestrel而不是IIS。我检查了容器上的一些日志,发现以下异常:
"
失败:Microsoft.AspNetCore.Server.Kestrel[13]
连接id“0HM8CJ9JFRGLB”,请求id“0HM8CJ9JFRGLB:0000000 1”:应用程序引发了未处理的异常
User.Domain.User.Exceptions.InvalidPasswordException:密码长度必须至少为8个字符,必须包含数字、大写英文字母、小写英文字母和一个特殊字符
"
我做错了什么?您需要设置
exceptionContext.ExceptionHandled=true在OnException
事件处理程序中的code>
但问题的根源在于,您使用的是MVC时代遗留的、不推荐使用的ExceptionFilterAttribute
——您应该改为使用或并传入异常处理程序(可以很容易地调用另一个方法,而不必按照Microsoft的示例进行内联)。这两个选项中的任何一个都可以修复您以同步方式调用异步代码的问题,这肯定会在以后的某个地方给您带来问题