Промежуточное программное обеспечение не вызывается для синхронных запросов - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь регистрировать необработанные исключения для часового, используя SentryDotNet.AspNetCore.

В моем файле 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); });
    }

Существует пример вызова для вызова промежуточного программного обеспечения, которое успешно регистрируется в часовом.,

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 работал из коробки.Были и другие небольшие проблемы со всеми другими пакетами, которые я пробовал.

1 Ответ

0 голосов
/ 05 декабря 2018

Порядок добавления промежуточного программного обеспечения важен, так как они вызываются в том порядке, в котором они были добавлены в конвейер.

Регистраторы и обработчики ошибок должны быть добавлены в конвейер очень рано.

Убедитесь, что вы UseSentryDotNet() после любого промежуточного программного обеспечения, которое перехватывает исключения.В противном случае промежуточное ПО SentryDotNet не увидит исключения.Например, app.UseDeveloperExceptionPage() следует использовать до 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?}");
    });
}

Причина, по которой ваш пример сработал, заключается в том, что вы добавили егопосле добавления промежуточного программного обеспечения.

В других вызовах ошибки возникают до того, как оно достигнет промежуточного программного обеспечения, поэтому они не будут перехвачены.

Ссылка ASP.NET CoreПромежуточное программное обеспечение

Ссылка Обработка ошибок в ASP.NET Core

...