मेरे पास एएसपीनेट कोर एप्लिकेशन है। कॉन्फ़िगरेशन विधि का कार्यान्वयन उपयोगकर्ता को "त्रुटि" पृष्ठ पर रीडायरेक्ट करता है जब कोई अपवाद होता है (गैर विकास वातावरण में)एएसपीनेट कोर में अपवाद को संभालना?
हालांकि यह केवल तभी काम करता है जब अपवाद नियंत्रक के अंदर होता है। यदि अपवाद नियंत्रक के बाहर होता है, उदाहरण के लिए मेरे कस्टम मिडलवेयर में, तो उपयोगकर्ता को त्रुटि पृष्ठ पर रीडायरेक्ट नहीं किया जाता है।
यदि मिडलवेयर में अपवाद है तो मैं उपयोगकर्ता को "त्रुटि" पृष्ठ पर कैसे रीडायरेक्ट कर सकता हूं।
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?}");
});
}
अद्यतन 1
मैं निम्नांकित दो पंक्तियों कि आरंभिक पोस्ट में लापता थे के साथ ऊपर अद्यतन कोड।
app.UseSession();
app.UseMyMiddleware();
इसके अलावा मुझे पता चला कि app.UseExceptionHandler
त्रुटि पृष्ठ पर रीडायरेक्ट करने में सक्षम नहीं था।
जब मेरे मिडलवेयर कोड में कोई अपवाद है, app.UseExceptionHandler("\Home\Error")
अपेक्षित के रूप में \Home\Error
पर रीडायरेक्ट कर रहा है; लेकिन चूंकि यह एक नया अनुरोध है, इसलिए मेरा मिडलवेयर फिर से निष्पादित कर रहा था और फिर अपवाद फेंक रहा था।
तो इस मुद्दे को हल करने के लिए मैं अपने मिडलवेयर बदल निष्पादित करने के लिए केवल if context.Request.Path != "/Home/Error"
मुझे यकीन है कि नहीं कर रहा हूँ अगर यह इस मुद्दे लेकिन इसके काम कर हल करने के लिए सही तरीका है।
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>();
}
}
उदाहरण में आपका कस्टम मिडलवेयर कहां है? मैं ** सोचता हूं ** 'उपयोग एक्स्प्शन हैंडलर' इसे संभालने में सक्षम होना चाहिए, लेकिन ** के बाद आपके मिडलवेयर को पंजीकृत होना आवश्यक है। – Tseng