gpt4 book ai didi

c# - 不为同步请求调用中间件

转载 作者:行者123 更新时间:2023-11-30 15:52:49 24 4
gpt4 key购买 nike

我尝试使用 SentryDotNet.AspNetCore 将未处理的异常记录到 Sentry 。

我的 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");
}

问题在于,如果在 Controller 操作中抛出异常,则不会调用中间件。

    public IActionResult LogError()
{
throw new Exception("mvc error");
}

我在中间件的Invoke方法下了一个断点,当action中的异常抛出时没有命中。

中间件有这个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;

}

是否缺少某些东西,以便调用中间件的 invoke 方法来处理操作中未处理的异常?

编辑

对我来说, Sentry Sentry.AspNetCore 提供的实现是开箱即用的。我尝试过的所有其他软件包都存在其他小故障。

最佳答案

添加中间件的顺序很重要,因为它们按照添加到管道中的顺序被调用。

记录器和错误处理程序应该尽早添加到管道中。

Make sure you UseSentryDotNet() after any middleware that intercepts exceptions. Otherwise, the SentryDotNet middleware will not see the exception. E.g. the app.UseDeveloperExceptionPage() should be used before app.UseSentryDotNet()

引用 GitHub : SentryDotNet

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
// Make sure middleware that catches exceptions without
// rethrowing them is added *before* SentryDotNet
app.UseDeveloperExceptionPage();

//Add sentry
app.UseSentryDotNet(new SentryDotNetOptions { CaptureRequestBody = true });

// Other middleware, e.g. app.UseMvc()

app.UseStaticFiles();

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}

您的示例之所以有效,是因为您是在添加 Sentry 中间件之后添加的。

在其他调用中,错误发生在它到达 Sentry 中间件之前,因此它们不会被捕获。

引用 ASP.NET Core Middleware

引用 Handle errors in ASP.NET Core

关于c# - 不为同步请求调用中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53622325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com