c# - 为什么我的 GlobalExceptionFilter 不能在 NET.Core 上运行?
问题描述
我正在尝试在 NET Core WEB API 中实现 GlobalExceptionFilter。这是我的过滤器代码:
public class GlobalExceptionFilter : IExceptionFilter, IDisposable
{
private readonly ILogger _logger;
public GlobalExceptionFilter(ILoggerFactory logger)
{
if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
this._logger = logger.CreateLogger("Global Exception Filter");
}
public void Dispose()
{
}
public void OnException(ExceptionContext context)
{
Dictionary<string, string> data = new Dictionary<string, string>();
HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
String message = String.Empty;
var ex = context.Exception;
TypeSwitch.Do(ex,
TypeSwitch.Case<ArgumentException>(() => { statusCode = HttpStatusCode.BadRequest; }),
TypeSwitch.Case<ArgumentNullException>(() => { statusCode = HttpStatusCode.BadRequest; }),
TypeSwitch.Case<ArgumentOutOfRangeException>(() => { statusCode = HttpStatusCode.BadRequest; }),
TypeSwitch.Case<KeyNotFoundException>(() => { statusCode = HttpStatusCode.NotFound; }),
TypeSwitch.Case<DivideByZeroException>(() => { statusCode = HttpStatusCode.MethodNotAllowed; }),
TypeSwitch.Case<QueryFormatException>(() => { statusCode = HttpStatusCode.MethodNotAllowed; })
);
HttpResponse response = context.HttpContext.Response;
response.StatusCode = (int)statusCode;
response.ContentType = "application/json";
var err = new ErrorPayload()
{
Data = data,
StackTrace = ex.StackTrace,
Message = ex.Message,
StatusCode = (int)statusCode
};
response.WriteAsync(JsonConvert.SerializeObject(err));
}
}
这是我的初始化代码
public void ConfigureServices(IServiceCollection services)
{
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc( config =>
{
config.Filters.Add(typeof(GlobalExceptionFilter));
}
);
}
我正在测试这个控制器方法中的错误处理
[HttpGet("{idCliente}")]
public IActionResult GetCliente(int idCliente)
{
throw new QueryFormatException("My Custom Exception");
}
有任何想法吗?谢谢!
更新
好吧,我不得不承认我认为这不起作用,因为 Postman 向我显示连接错误,而不是 NotFound (404) 的 MethodNotAllowed。正如建议的那样,我检查了调试和状态响应,实际上是预期值。
解决方案
推荐阅读
- asp.net-core - 基于策略的授权,仅允许作为资源所有者的用户能够查看/编辑
- python - 访问类外的类方法变量
- azure-devops - 如何在 azure DevOps YAML 管道中发送构建后消息?
- angular - 如何在ng中为每3个元素添加行和列
- r - blogdown hugo 删除社交链接
- php - Laravel 419 点击登录后过期
- ios - 如何用变量的内容命名结构的实例 - Swift
- windows - powershell 脚本 - 每周发送一次电子邮件,其中包含来自事件查看器的信息
- java - 无法存储通过硒列表中的搜索文本字段生成的下拉列表项
- php - 添加到购物车按钮不起作用 打开购物车