La manipulation d'exception dans asp.net core?

J'ai asp.net application de base. La mise en œuvre de la méthode configure () redirige l'utilisateur vers une "Erreur" à la page quand il y a une exception ( non en environnement de Développement)

Toutefois, il ne fonctionne que si l'exception se produit à l'intérieur du contrôleur. Si une exception se produit à l'extérieur du contrôleur, par exemple, dans mes personnalisé middleware, alors l'utilisateur n'est pas d'être redirigé vers une page d'erreur.

Comment puis-je rediriger l'utilisateur "Erreur" la page si il y a une exception dans le middleware.

     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseApplicationInsightsRequestTelemetry();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseApplicationInsightsExceptionTelemetry();

        app.UseStaticFiles();
        app.UseSession();
        app.UseMyMiddleware();

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

Mise à jour de 1
J'ai mis à jour le code ci-dessus avec les deux lignes suivantes qui manquaient dans le post initial.

        app.UseSession();
        app.UseMyMiddleware();

Aussi j'ai trouvé pourquoi app.UseExceptionHandler n'a pas été en mesure de rediriger vers une page d'Erreur.
Quand il y a une exception dans mon middleware code, app.UseExceptionHandler("\Home\Error") est de la redirection vers \Home\Error comme prévu; mais puisque c'est une nouvelle demande, mon middleware était en cours d'exécution à nouveau et de les jeter exception de nouveau.
Donc pour résoudre le problème j'ai changé mon middleware pour s'exécuter uniquement if context.Request.Path != "/Home/Error"

Je ne suis pas sûr si ce est la bonne façon de résoudre ce problème, mais son travail.

public class MyMiddleWare
{
    private readonly RequestDelegate _next;
    private readonly IDomainService _domainService;

    public MyMiddleWare(RequestDelegate next, IDomainService domain)
    {
        _next = next;
        _domainService = domain;
    }

    public async Task Invoke(HttpContext context)
    {
        if (context.Request.Path != "/Home/Error")
        {
            if (context.User.Identity.IsAuthenticated && !context.Session.HasKey(SessionKeys.USERINFO))
            {           
                //this method may throw exception if domain service is down
                var userInfo = await _domainService.GetUserInformation(context.User.Name).ConfigureAwait(false);                    

                context.Session.SetUserInfo(userInfo);
            }
        }

        await _next(context);
    }
}

public static class MyMiddleWareExtensions
{
    public static IApplicationBuilder UseMyMiddleWare(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<MyMiddleWare>();
    }
 }
Où est votre coutume middleware? J' pense UseExeptionHandler doit être capable de gérer cela, mais votre middleware doit être enregistré après.

OriginalL'auteur LP13 | 2016-11-15