我尝试使用SentryDotNet.AspNetCore将未处理的异常记录到sentry。
我的startup.cs文件中有以下内容:
问题在于,如果控制器操作中抛出异常,则中间件不会被调用。
我在中间件的Invoke方法上设置了断点,但当操作中抛出异常时,断点没有被触发。
我发现它在应用程序启动时进行初始化。
我的startup.cs文件中有以下内容:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
var dsn = "[dsn]";
services.AddSentryDotNet(
new SentryClient(
dsn,
new SentryEventDefaults(
environment: "test",
release: typeof(Startup).Assembly.GetName().Version.ToString(3),
logger: "coremvcapp")));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
app.UseSentryDotNet(new SentryDotNetOptions { CaptureRequestBody = true });
//app.Run(async context => { await DoSomethingAsync(context); });
}
这里有一个示例调用中间件的代码,可以成功地将日志记录到Sentry。
private static async Task DoSomethingAsync(HttpContext context)
{
if (context.Request.Path.HasValue && context.Request.Path.Value.Contains("error"))
{
throw new InvalidOperationException("Boom");
}
await context.Response.WriteAsync("some stuff");
}
问题在于,如果控制器操作中抛出异常,则中间件不会被调用。
public IActionResult LogError()
{
throw new Exception("mvc error");
}
我在中间件的Invoke方法上设置了断点,但当操作中抛出异常时,断点没有被触发。
这个中间件有一个Invoke方法。
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (Exception e) when (_client != null)
{
// log stuff
throw;
}
}
我发现它在应用程序启动时进行初始化。
public SentryDotNetMiddleware(RequestDelegate next, ISentryClient client, SentryDotNetOptions options)
{
_next = next;
_client = client;
_options = options;
}
是否有遗漏导致中间件的调用方法未在操作中处理未处理的异常?
编辑
对于我来说,由Sentry.AspNetCore提供的实现可以直接使用。其他所有我尝试过的软件包都存在一些小问题。