2016-11-15 13 views
7

मेरे पास एएसपीनेट कोर एप्लिकेशन है। कॉन्फ़िगरेशन विधि का कार्यान्वयन उपयोगकर्ता को "त्रुटि" पृष्ठ पर रीडायरेक्ट करता है जब कोई अपवाद होता है (गैर विकास वातावरण में)एएसपीनेट कोर में अपवाद को संभालना?

हालांकि यह केवल तभी काम करता है जब अपवाद नियंत्रक के अंदर होता है। यदि अपवाद नियंत्रक के बाहर होता है, उदाहरण के लिए मेरे कस्टम मिडलवेयर में, तो उपयोगकर्ता को त्रुटि पृष्ठ पर रीडायरेक्ट नहीं किया जाता है।

यदि मिडलवेयर में अपवाद है तो मैं उपयोगकर्ता को "त्रुटि" पृष्ठ पर कैसे रीडायरेक्ट कर सकता हूं।

 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>(); 
    } 
} 
+0

उदाहरण में आपका कस्टम मिडलवेयर कहां है? मैं ** सोचता हूं ** 'उपयोग एक्स्प्शन हैंडलर' इसे संभालने में सक्षम होना चाहिए, लेकिन ** के बाद आपके मिडलवेयर को पंजीकृत होना आवश्यक है। – Tseng

उत्तर

5

कस्टम अपवाद हैंडलिंग को संभालने के लिए आपको अपना खुद का मिडलवेयर लिखना चाहिए। और सुनिश्चित करें कि आप इसे अपने मिडलवेयर स्टैक की शुरुआत (पहली बार संभव हो) में जोड़ दें क्योंकि मिडलवेयर में होने वाले अपवाद जो "पहले" स्टैक में हैं, को संभाला नहीं जाएगा।

उदाहरण:

public class CustomExceptionMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public CustomExceptionMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     try 
     { 
      await _next.Invoke(context); 
     } 
     catch (Exception e) 
     { 
      // Handle exception 
     } 
    } 
} 
+1

'माइक्रोसॉफ्ट.एस्पनेट नेट। डायग्नोस्टिक्स.एक्सप्शन हैंडलर मिडलवेयर 'वही वही काम करता है जो आपने सुझाया है। यह मिडलवेयर अपवाद के कारण प्रदान किए गए पथ पर रीडायरेक्ट करता है। आप कोड https://github.com/aspnet/Diagnostics/blob/dev/src/Microsoft.AspNetCore.Diagnostics/ExceptionHandler/ExceptionHandlerMiddleware कोड देख सकते हैं।सीएस – LP13

5

आप अपवादों UseExceptionHandler() को संभालने के लिए उपयोग कर सकते हैं, अपने Startup.cs में इस कोड डाल दिया।

उपयोग एक्स्सेप्शन हैंडलर का उपयोग विश्व स्तर पर अपवादों को संभालने के लिए किया जा सकता है। आप अपवाद ऑब्जेक्ट जैसे स्टैक ट्रेस, इनर अपवाद और अन्य के सभी विवरण प्राप्त कर सकते हैं। और फिर आप उन्हें स्क्रीन पर दिखा सकते हैं। Here

यहाँ आप और इस नैदानिक ​​मिडलवेयर के बारे में अधिक पढ़ सकते हैं और प्राप्त कर सकते हैं कैसे IExceptionFilter का उपयोग कर अपने स्वयं के कस्टम अपवाद संचालक बनाने के द्वारा।

app.UseExceptionHandler(
       options => 
       { 
        options.Run(
         async context => 
         { 
          context.Response.StatusCode = (int) HttpStatusCode.InternalServerError; 
          context.Response.ContentType = "text/html"; 
          var ex = context.Features.Get<IExceptionHandlerFeature>(); 
          if (ex != null) 
          { 
           var err = $"<h1>Error: {ex.Error.Message}</h1>{ex.Error.StackTrace}"; 
           await context.Response.WriteAsync(err).ConfigureAwait(false); 
          } 
         }); 
       } 
      ); 

तुम भी डिफ़ॉल्ट की तरह UseDeveloperExceptionPage() की स्थापना को हटाना होगा, अगर आप इसका इस्तेमाल, यह हमेशा डिफ़ॉल्ट त्रुटि पृष्ठ प्रदर्शित करते हैं।

if (env.IsDevelopment()) 
     { 
      //This line should be deleted 
      app.UseDeveloperExceptionPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 
+0

मैं पहले इस लेख से गुजर चुका हूं। हालांकि मुझे लगता है कि जब भी आप प्रतिक्रिया सेट करते हैं तो समस्या तब होती है। ब्राउजर 500 से ब्राउजर कोड उस सर्वर को 'एचटीएमएल' नहीं दिखाता है जो सर्वर भेजता है, इसके बजाय ब्राउजर कोड 500 के लिए अपना खुद का त्रुटि पेज दिखाता है। फिडलर में मुझे लगता है कि प्रतिक्रिया निकाय में त्रुटि संदेश है जो सर्वर भेजता है लेकिन ब्राउजर उस त्रुटि संदेश को नहीं दिखाता है। – LP13

+0

बस startup.cs ऐप से हटाएं। उपयोग डेवलपर अपवाद पृष्ठ(); –

+0

बीटीडब्ल्यू मैंने 'अपवाद FilterAttribute' से प्राप्त कस्टम अपवाद फ़िल्टर विशेषता भी बनाई है। यह नियंत्रक के अंदर सभी अपवादों का ख्याल रखता है। मैं मिडलवेयर में अपवाद हैंडलिंग की तलाश में हूं। भले ही मैं 'app.UseExceptionHandler' का उपयोग करके वैश्विक स्तर पर संभालता हूं या अपवाद को संभालने के लिए अपना स्वयं का मिडलवेयर बना देता हूं, यह उपयोगकर्ता को त्रुटि दृश्य में रीडायरेक्ट नहीं करता है। – LP13

संबंधित मुद्दे