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>();
}
}
UseExeptionHandler
doit être capable de gérer cela, mais votre middleware doit être enregistré après.OriginalL'auteur LP13 | 2016-11-15
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser pour gérer les exceptions
UseExceptionHandler()
, mettez ce code dans votreStartup.cs
.Ici Vous pouvez lire plus sur ce diagnostic middleware et de trouver comment l'utilisation de
IExceptionFilter
et par la création de votre propre gestionnaire d'exception.Vous devez également supprimer le paramètre par défaut comme
UseDeveloperExceptionPage()
, si vous l'utilisez, il toujours afficher la page d'erreur par défaut.html
que le serveur envoie, au lieu navigateur affiche sa propre page d'erreur pour le code 500. Dans un violon, je vois le corps de la réponse a un message d'erreur du serveur envoie, mais le navigateur n'affiche pas ce message d'erreur.Il suffit de supprimer dès le démarrage.cs app.UseDeveloperExceptionPage();
btw j'ai également créé exception personnalisée filtre d'attribut dérivé de
ExceptionFilterAttribute
. Cela prend en charge toutes les exceptions à l'intérieur du contrôleur. Im la recherche pour la gestion des exceptions dans le middleware. Même si j'ai de la poignée à l'échelle mondiale à l'aide deapp.UseExceptionHandler
ou de créer mon propre middleware pour gérer exception, elle ne permet pas de rediriger l'utilisateur vers d'erreur de la vue.Vous devez supprimer l'application.UseDeveloperExceptionPage(); et il aura du travail.
je ne pense pas que c'est la question comme je l'ai dit dans mon post sa passe dans non Développement environnement
OriginalL'auteur M. Wiśnicki
Vous devez écrire votre propre middleware pour gérer personnalisé de gestion des exceptions. Et assurez-vous que vous l'ajouter vers le début (la première si possible) de votre pile de middleware car les exceptions qui se produisent dans le middleware est "plus haut" dans une pile ne sera pas traitée.
Exemple:
Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware
fait exactement la même chose que ce que vous avez suggéré. Ce middleware recdirects du chemin d'accès en cas d'exception. Vous pouvez voir le code github.com/aspnet/Diagnostics/blob/dev/src/...OriginalL'auteur Andrius