কীভাবে এলএসএইচকে এএসপি.নেট এমভিসি [হ্যান্ডলিরর] বৈশিষ্ট্যের সাথে কাজ করবেন?


564

আমি আমার এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটিতে ত্রুটিগুলি লগ করতে ELMAH ব্যবহার করার চেষ্টা করছি, যাইহোক আমি যখন আমার নিয়ন্ত্রণকারীগুলিতে [হ্যান্ডলিরর] বৈশিষ্ট্যটি ব্যবহার করি তখন এলএএমএইচ যখন ত্রুটি ঘটে তখন লগ করে না।

যেহেতু আমি এটি অনুমান করছি কারণ ELMAH কেবল অযথিত ত্রুটিগুলিকে লগ করে এবং [হ্যান্ডলিরর] বৈশিষ্ট্যটি ত্রুটিটি পরিচালনা করছে সুতরাং এটি লগ করার দরকার নেই।

আমি কীভাবে সংশোধন করব বা কীভাবে আমি বৈশিষ্ট্যটি সংশোধন করতে যাব যাতে ELMAH জানতে পারে যে কোনও ত্রুটি হয়েছিল এবং এটি লগইন করে ..

সম্পাদনা: আমাকে নিশ্চিত করে নিন যে প্রত্যেকে বুঝতে পেরেছে, আমি জানি যে আমি জিজ্ঞাসা করছি না এমন বৈশিষ্ট্যটি আমি সংশোধন করতে পারি ... হ্যান্ডেলর অ্যাট্রিবিউট ব্যবহার করার সময় ELMAH বাইপাস হয়ে যায় অর্থ এটি হ্যান্ডেল করার কারণে কোনও ত্রুটি ছিল তা দেখতে পাবে না ইতিমধ্যে বৈশিষ্ট্য দ্বারা ... আমি যা জিজ্ঞাসা করছি তার ত্রুটিটি দেখার জন্য এটি লগ করার একটি উপায় রয়েছে এবং এট্রিবিউটটি হ্যান্ডল করা সত্ত্বেও ... আমি চারপাশে অনুসন্ধান করেছিলাম এবং লগ করতে বাধ্য করার জন্য কল করার কোনও পদ্ধতি দেখতে পাই না ভূল....


12
বাহ, আমি আশা করি জেফ বা জ্যারেড এই প্রশ্নের উত্তর দেবেন। তারা স্ট্যাকওভারফ্লো জন্য
ELMAH

11
হুম, আশ্চর্যজনক - আমরা হ্যান্ডলিরর অ্যাট্রিবিউট ব্যবহার করি না - এলমা আমাদের ওয়েবকনফিগের <মডুলস> বিভাগে সেটআপ হয়। হ্যান্ডলিআরআরট্রিবিউট ব্যবহার করে কি সুবিধা রয়েছে?
টেকনোলজি ডিক্সন

9
@ জারোদ - আপনার এলএমএইচ কাঁটাচামচ সম্পর্কে "কাস্টম" কী তা দেখে ভাল লাগবে।
স্কট হানসেলম্যান

3
@ ডিএসওয়াটিক আপনি ওয়েবকনফাইগে রেসপন্সরেড-এ পুনর্নির্দেশ মোড সেট করে পুনঃনির্দেশগুলিও প্রতিরোধ করতে পারেন। Blog.turlov.com/2009/01/…
পাভেল চুচুভা

6
আমি ওয়েব ডকুমেন্টেশন এবং পোস্টগুলিতে [হ্যান্ডলিরর] বৈশিষ্ট্য এবং এলমা সম্পর্কে কথা বলার চেষ্টা চালিয়ে যাচ্ছি, তবে ডামি কেস সেটআপ করার সময় আমি যে আচরণটি সমাধান করে (যেমন এলমা "পরিচালিত" ত্রুটিটি লগ করছে না) তা দেখিনি। এর কারণ এটি এলমা.এমভিসি ২.০.x হিসাবে এই কাস্টম হ্যান্ডলিররঅ্যাট্রিবিউটের আর প্রয়োজন নেই; এটি নুগেট প্যাকেজের অন্তর্ভুক্ত।
প্লাইউন

উত্তর:


503

আপনি এর সদস্যটিকে সাবক্লাস HandleErrorAttributeও ওভাররাইড করতে পারেন OnException(অনুলিপি করার দরকার নেই) যাতে এটি ব্যতিক্রমটি ELMAH এর সাথে লগ করে এবং কেবল যদি বেস বাস্তবায়ন এটি পরিচালনা করে। আপনার প্রয়োজনীয় ন্যূনতম পরিমাণটি নিম্নরূপ:

using System.Web.Mvc;
using Elmah;

public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        if (!context.ExceptionHandled) 
            return;
        var httpContext = context.HttpContext.ApplicationInstance.Context;
        var signal = ErrorSignal.FromContext(httpContext);
        signal.Raise(context.Exception, httpContext);
    }
}

বেস বাস্তবায়নটি প্রথমে আহ্বান জানানো হয়েছে, এটি ব্যতিক্রমকে পরিচালনা করা হিসাবে চিহ্নিত করার সুযোগ দেয়। তবেই ব্যতিক্রম সংকেত দেওয়া হয়। উপরের কোডটি সহজ এবং এটি এমন পরিবেশে ব্যবহার করা HttpContextযেতে পারে যেখানে এটি উপলব্ধ নাও হতে পারে যেমন পরীক্ষা করা। ফলস্বরূপ, আপনি কোডটি চাইবেন এটি হ'ল এটি আরও প্রতিরক্ষামূলক (কিছুটা দীর্ঘ হওয়ার ব্যয়ে):

using System.Web;
using System.Web.Mvc;
using Elmah;

public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        if (!context.ExceptionHandled       // if unhandled, will be logged anyhow
            || TryRaiseErrorSignal(context) // prefer signaling, if possible
            || IsFiltered(context))         // filtered?
            return;

        LogException(context);
    }

    private static bool TryRaiseErrorSignal(ExceptionContext context)
    {
        var httpContext = GetHttpContextImpl(context.HttpContext);
        if (httpContext == null)
            return false;
        var signal = ErrorSignal.FromContext(httpContext);
        if (signal == null)
            return false;
        signal.Raise(context.Exception, httpContext);
        return true;
    }

    private static bool IsFiltered(ExceptionContext context)
    {
        var config = context.HttpContext.GetSection("elmah/errorFilter")
                        as ErrorFilterConfiguration;

        if (config == null)
            return false;

        var testContext = new ErrorFilterModule.AssertionHelperContext(
                              context.Exception, 
                              GetHttpContextImpl(context.HttpContext));
        return config.Assertion.Test(testContext);
    }

    private static void LogException(ExceptionContext context)
    {
        var httpContext = GetHttpContextImpl(context.HttpContext);
        var error = new Error(context.Exception, httpContext);
        ErrorLog.GetDefault(httpContext).Log(error);
    }

    private static HttpContext GetHttpContextImpl(HttpContextBase context)
    {
        return context.ApplicationInstance.Context;
    }
}

এই দ্বিতীয় সংস্করণটি ELMAH থেকে প্রথমে ত্রুটি সংকেত ব্যবহার করার চেষ্টা করবে , যাতে সম্পূর্ণরূপে কনফিগার করা পাইপলাইন যেমন লগিং, মেলিং, ফিল্টারিং এবং আপনার কী রয়েছে invol এটি ব্যর্থ হয়ে, এটি ত্রুটিটি ফিল্টার করা উচিত কিনা তা দেখার চেষ্টা করে। যদি তা না হয় তবে ত্রুটিটি কেবল লগ হয়। এই প্রয়োগটি মেল বিজ্ঞপ্তিগুলি পরিচালনা করে না। যদি ব্যতিক্রমটি সিগন্যাল করা যায় তবে এটির জন্য কনফিগার করা থাকলে একটি মেল প্রেরণ করা হবে।

আপনাকে আরও খেয়াল রাখতে হবে যে যদি একাধিক HandleErrorAttributeউদাহরণ কার্যকর হয় তবে ডুপ্লিকেট লগিং ঘটে না, তবে উপরের দুটি উদাহরণগুলি আপনার শুরু করা উচিত।


1
চমৎকার। আমি মোটেও এলমা বাস্তবায়নের চেষ্টা করছিলাম না। আমি এমভিসির সাথে ভালভাবে কাজ করে এমন কয়েক বছর ধরে আমার নিজের ত্রুটি রিপোর্টিংয়ের চেষ্টা করার চেষ্টা করছিলাম। আপনার কোড আমাকে একটি সূচনা পয়েন্ট দিয়েছে। +1
স্টিভ ওয়ার্থহ্যাম

18
আপনার হ্যান্ডেলঅরর অ্যাট্রিবিউট সাবক্লাস করার দরকার নেই। আপনার কেবলমাত্র একটি আইসেক্সেপশন ফিল্টার বাস্তবায়ন থাকতে পারে এবং এটি হ্যান্ডেলএররঅ্যাট্রিবিউটের সাথে একসাথে নিবন্ধভুক্ত করা যেতে পারে। ত্রুটি-সিগন্যাল.রাইজ (..) ব্যর্থ হলে আপনার ফ্যালব্যাক কেন দরকার তা আমিও পাই না। পাইপলাইনটি খারাপভাবে কনফিগার করা থাকলে এটি ঠিক করা উচিত। 5 টি লাইন আইেক্সেপশন ফিল্টার চেক পয়েন্ট 4 এর জন্য - এখানে ivanz.com/2011/05/08/…
ইভান

5
দয়া করে আপনি নীচে উত্তর সম্পর্কে মন্তব্য করতে পারেন @ ইভানজ্লেভ দ্বারা প্রয়োগযোগ্যতা, ত্রুটিগুলি ইত্যাদির সাথে সম্পর্কিত ইত্যাদি People এটি সম্পর্কে আপনার দৃষ্টিভঙ্গি রাখা এবং এই উত্তরগুলির সাথে কিছু স্পষ্টতা অর্জন করা ভাল হবে।
অ্যান্ড্রু

7
এটি কি এখনও প্রাসঙ্গিক বা ELMAH.MVC এটি পরিচালনা করে?
রোমিয়াস

2
এমনকি আমি এটি আজকের সংস্করণে এখনও প্রাসঙ্গিক কিনা তা জানতে চাই
রেফ্যাক্টর

299

দুঃখিত, তবে আমি মনে করি গ্রহণযোগ্য উত্তরটি একটি ওভারকিল। আপনাকে যা করতে হবে তা হ'ল:

public class ElmahHandledErrorLoggerFilter : IExceptionFilter
{
    public void OnException (ExceptionContext context)
    {
        // Log only handled exceptions, because all other will be caught by ELMAH anyway.
        if (context.ExceptionHandled)
            ErrorSignal.FromCurrentContext().Raise(context.Exception);
    }
}

এবং তারপরে এটি Global.asax.cs এ নিবন্ধ করুন (ক্রমটি গুরুত্বপূর্ণ):

public static void RegisterGlobalFilters (GlobalFilterCollection filters)
{
    filters.Add(new ElmahHandledErrorLoggerFilter());
    filters.Add(new HandleErrorAttribute());
}

3
+1 খুব সুন্দর, প্রসারিত করার HandleErrorAttributeদরকার নেই, ওভাররাইড OnExceptionকরার দরকার নেই BaseController। এটি গ্রহণযোগ্য উত্তর মনে করুন।
কলমেলএএনএন

1
@ বিগব আমি মনে করি ব্যতিক্রম বার্তা ইত্যাদিতে জিনিস সংযোজন করতে আপনাকে নিজের ব্যতিক্রম প্রকারের মধ্যে ব্যতিক্রমগুলি আবৃত করতে হবে (উদাহরণস্বরূপ new UnhandledLoggedException(Exception thrown)যা Messageএটি ফেরত দেওয়ার আগে কিছু যুক্ত করে।
ইভান জ্লেতেভ

23
আতিফ আজিজ ELMAH তৈরি করেছেন, আমি তার উত্তরটি নিয়ে যাব
জ্যামিবারো

48
@ জামিবারো আমি তা বুঝতে পারি নি, তবে তার উত্তরটি ২ বছরের পুরানো এবং সম্ভবত আরও কম স্বাবলম্বিতভাবে প্রশ্নের ব্যবহারের ক্ষেত্রে সমর্থন করার জন্য এপিআই সহজতর করা হয়েছে।
ইভান জ্লেতেভ

6
@ ইভান জ্লেতেভ সত্যিই এলমাহে কাজ করতে ElmahHandledErrorLoggerFilter()পারছেন না কেবল অনিচ্ছাকৃত ত্রুটিগুলি লগিং করে, তবে পরিচালনা করেননি। আপনি উল্লেখ করেছেন যে আমি সঠিক ক্রমে ফিল্টার নিবন্ধিত, কোন চিন্তা?
কুনসেভিচ.দেব

14

নুগেটে এখন একটি এলএমএএইচ.এমভিসি প্যাকেজ রয়েছে যার মধ্যে আতিফের একটি উন্নত সমাধান রয়েছে এবং এমন একটি কন্ট্রোলারও রয়েছে যা এমভিসি রাউটিংয়ের মধ্যে এলমা ইন্টারফেস পরিচালনা করে (সেই অক্ষটি আর ব্যবহার করার দরকার নেই)
সেই সমাধানটি নিয়ে সমস্যা (এবং এখানে সমস্ত কিছু রয়েছে) ) এটি হ'ল এক উপায় বা অন্যভাবে এলামার ত্রুটি হ্যান্ডলারটি ত্রুটিটি পরিচালনা করছে যা আপনি কাস্টমআরর ট্যাগ হিসাবে সেট আপ করতে চান বা ত্রুটিহ্যান্ডলার বা আপনার নিজের ত্রুটি হ্যান্ডলারের মাধ্যমে অগ্রাহ্য করছেন
সেরা সমাধান আইএমএইচও হ'ল এমন একটি ফিল্টার তৈরি করা যা অন্য সমস্ত ফিল্টারগুলির শেষে কাজ করে এবং ইতিমধ্যে হ্যান্ডেল করা ইভেন্টগুলিকে লগ করে। অ্যাপ্লিকেশনটির হাতছাড়া হওয়া অন্যান্য ত্রুটিগুলি এলগাহুল মডিউলটির লগ করার ক্ষেত্রে যত্ন নেওয়া উচিত। এটি আপনাকে স্বাস্থ্য মনিটর এবং অন্যান্য সমস্ত মডিউলগুলিও ত্রুটির ইভেন্টগুলি দেখার জন্য এসপ.netতে যুক্ত করা যেতে পারে

আমি এলেমা.এমভিসি এর ভিতরে ত্রুটিহ্যান্ডলারের প্রতিফলকের সাথে এই চেহারাটি লিখেছি

public class ElmahMVCErrorFilter : IExceptionFilter
{
   private static ErrorFilterConfiguration _config;

   public void OnException(ExceptionContext context)
   {
       if (context.ExceptionHandled) //The unhandled ones will be picked by the elmah module
       {
           var e = context.Exception;
           var context2 = context.HttpContext.ApplicationInstance.Context;
           //TODO: Add additional variables to context.HttpContext.Request.ServerVariables for both handled and unhandled exceptions
           if ((context2 == null) || (!_RaiseErrorSignal(e, context2) && !_IsFiltered(e, context2)))
           {
            _LogException(e, context2);
           }
       }
   }

   private static bool _IsFiltered(System.Exception e, System.Web.HttpContext context)
   {
       if (_config == null)
       {
           _config = (context.GetSection("elmah/errorFilter") as ErrorFilterConfiguration) ?? new ErrorFilterConfiguration();
       }
       var context2 = new ErrorFilterModule.AssertionHelperContext((System.Exception)e, context);
       return _config.Assertion.Test(context2);
   }

   private static void _LogException(System.Exception e, System.Web.HttpContext context)
   {
       ErrorLog.GetDefault((System.Web.HttpContext)context).Log(new Elmah.Error((System.Exception)e, (System.Web.HttpContext)context));
   }


   private static bool _RaiseErrorSignal(System.Exception e, System.Web.HttpContext context)
   {
       var signal = ErrorSignal.FromContext((System.Web.HttpContext)context);
       if (signal == null)
       {
           return false;
       }
       signal.Raise((System.Exception)e, (System.Web.HttpContext)context);
       return true;
   }
}

এখন, আপনার ফিল্টার কনফিগারেশনে আপনি এর মতো কিছু করতে চান:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //These filters should go at the end of the pipeline, add all error handlers before
        filters.Add(new ElmahMVCErrorFilter());
    }

লক্ষ্য করুন যে আমি লোকদের মনে করিয়ে দেওয়ার জন্য সেখানে একটি মন্তব্য রেখেছি যে যদি তারা এমন একটি গ্লোবাল ফিল্টার যুক্ত করতে চান যা এটির শেষ ব্যতীত ফিল্টার হওয়ার আগে অবশ্যই ব্যতিক্রমটি পরিচালনা করতে পারে তবে অন্যথায় আপনি সেই ক্ষেত্রে চলে যাবেন যেখানে এলহাম এমভিসিসিআরআর ফিল্টার দ্বারা অবহেলিত হবে না এটি পরিচালনা করা হয়নি এবং এটি এলমাহ মডিউল দ্বারা চাপানো উচিত তবে তারপরে পরবর্তী ফিল্টারটি হ্যান্ডল হওয়া হিসাবে ব্যতিক্রম চিহ্নিত করে এবং মডিউলটি এড়িয়ে যায়, ব্যতিক্রমের ফলস্বরূপ এটি কখনই এলামায় পরিণত হয় না।

এখন, নিশ্চিত হয়ে নিন যে আপনার ওয়েবকনফিগের এলামার জন্য অ্যাপসেটিংগুলি কিছু দেখতে এইরকম:

<add key="elmah.mvc.disableHandler" value="false" /> <!-- This handles elmah controller pages, if disabled elmah pages will not work -->
<add key="elmah.mvc.disableHandleErrorFilter" value="true" /> <!-- This uses the default filter for elmah, set to disabled to use our own -->
<add key="elmah.mvc.requiresAuthentication" value="false" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.allowedRoles" value="*" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.route" value="errortracking" /> <!-- Base route for elmah pages -->

এখানে গুরুত্বপূর্ণটি হ'ল "elmah.mvc.disableHandleErrorFilter", যদি এটি মিথ্যা হয় তবে এটি elmah.mvc এর হ্যান্ডলারটি ব্যবহার করবে যা প্রকৃতপক্ষে ডিফল্ট হ্যান্ডেলআররহ্যান্ডলারের সাহায্যে ব্যতিক্রমটি পরিচালনা করবে যা আপনার কাস্টমআরর সেটিংসকে উপেক্ষা করবে

এই সেটআপটি আপনাকে ক্লাস এবং ভিউগুলিতে নিজের ত্রুটিহ্যান্ডলার ট্যাগগুলি সেট করার অনুমতি দেয়, তবু তবুও ত্রুটিগুলি এলামাহাভিভিসিআররিরফিল্টারের মাধ্যমে লগ ইন করার পরে, এলমাহ মডিউলটির মাধ্যমে আপনার ওয়েবকনফাইগে একটি কাস্টমরর কনফিগারেশন যুক্ত করে এমনকি আপনার নিজের ত্রুটি হ্যান্ডলারগুলিও লিখে দেয়। কেবলমাত্র আপনাকে যা করতে হবে তা হ'ল কোনও ফিল্টার যুক্ত না করা যা আমাদের লিখিত এলমা ফিল্টারের আগে ত্রুটিটি আসলে পরিচালনা করবে। এবং আমি উল্লেখ করতে ভুলে গেছি: এলামে কোনও নকল নেই।


7

আপনি উপরের কোডটি নিতে পারেন এবং প্রতিটি নিয়ামকের মধ্যে হ্যান্ডলআররউইথেলহম গুণকে ইনজেক্ট করে এমন একটি কাস্টম নিয়ামক কারখানা চালু করে আরও একধাপ এগিয়ে যেতে পারেন।

আরও তথ্যের জন্য এমভিসিতে লগ ইন করার জন্য আমার ব্লগ সিরিজটি দেখুন। প্রথম নিবন্ধে এলহামাকে এমভিসির জন্য প্রস্তুত করা এবং চালানোর বিষয়ে অন্তর্ভুক্ত রয়েছে।

নিবন্ধের শেষে ডাউনলোডযোগ্য কোডের একটি লিঙ্ক রয়েছে। আশা করি এইটি কাজ করবে.

http://dotnetdarren.wordpress.com/


6
আমার কাছে দেখে মনে হচ্ছে এটি কেবল বেইস কন্ট্রোলার ক্লাসে লেগে থাকা অনেক সহজ হবে!
নাথন টেলর

2
লগিং এবং ব্যতিক্রম হ্যান্ডলিং সম্পর্কিত উপরের ড্যারেনের সিরিজটি ভালভাবে পড়ার পক্ষে মূল্যবান !!! খুব বিস্তারিত!
রায়ান অ্যান্ডারসন

6

আমি এএসপি.এনইটি এমভিসিতে নতুন। আমি একই সমস্যার মুখোমুখি হয়েছি, নিম্নলিখিতটি আমার এরিয়ার.ভিবিএইচটিএমএল (আমার যদি কেবলমাত্র এলমা লগ ব্যবহার করে ত্রুটিটি লগ করতে হবে তবে এটি কাজ করবে)

@ModelType System.Web.Mvc.HandleErrorInfo

    @Code
        ViewData("Title") = "Error"
        Dim item As HandleErrorInfo = CType(Model, HandleErrorInfo)
        //To log error with Elmah
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(New Elmah.Error(Model.Exception, HttpContext.Current))
    End Code

<h2>
    Sorry, an error occurred while processing your request.<br />

    @item.ActionName<br />
    @item.ControllerName<br />
    @item.Exception.Message
</h2> 

এটা সহজ!


এটি এখন পর্যন্ত সবচেয়ে সহজ সমাধান। কাস্টম হ্যান্ডলার এবং স্টাফ লিখতে বা নিবন্ধ করার দরকার নেই। আমার পক্ষে ভাল কাজ করে
থিয়াগোআলভস

3
কোনও JSON / নন- এইচটিএমএল প্রতিক্রিয়াগুলির জন্য উপেক্ষা করা হবে।
ক্রেগ স্টান্টজ

6
এছাড়াও এটি একটি দর্শনায় পরিষেবা স্তরের কার্যকারিতা করছে। এখানে নেই।
ট্রেভর ডি কোয়েকোয়েক

6

একটি সম্পূর্ণ বিকল্প সমাধান হ'ল এমভিসি ব্যবহার না করা HandleErrorAttribute, এবং পরিবর্তে এএসপি.নিট ত্রুটি পরিচালনার উপর নির্ভর করুন, যা এলমা কাজ করার জন্য ডিজাইন করেছে।

আপনাকে HandleErrorAttributeApp_Start \ FilterConfig (বা Global.asax) থেকে ডিফল্ট গ্লোবালটি সরিয়ে ফেলতে হবে এবং তারপরে আপনার ওয়েবকনফাইগে একটি ত্রুটি পৃষ্ঠা সেট আপ করতে হবে:

<customErrors mode="RemoteOnly" defaultRedirect="~/error/" />

দ্রষ্টব্য, এটি একটি এমভিসি রাউটেড URL হতে পারে, সুতরাং ErrorController.Indexকোনও ত্রুটি দেখা দিলে উপরেরটি ক্রিয়ায় পুনর্নির্দেশ করবে ।


এটি এখন পর্যন্ত সবচেয়ে সহজ সমাধান, এবং ডিফল্ট পুনর্নির্দেশ করা এমভিসি অ্যাকশন হতে পারে :)
জেরেমি কুক

3
এটি অন্যান্য ধরণের অনুরোধগুলির জন্য পুনর্নির্দেশ করবে, যেমন জেএসওএন ইত্যাদি - ভাল নয়।
zvolkov

5

আমার জন্য ইমেল লগিংয়ের কাজ করা খুব গুরুত্বপূর্ণ ছিল। কিছু সময়ের পরে আমি আবিষ্কার করেছি যে এটির জন্য আতিফ উদাহরণে কোডের আরও 2 লাইন বেশি প্রয়োজন।

public class HandleErrorWithElmahAttribute : HandleErrorAttribute
{
    static ElmahMVCMailModule error_mail_log = new ElmahMVCMailModule();

    public override void OnException(ExceptionContext context)
    {
        error_mail_log.Init(HttpContext.Current.ApplicationInstance);
        [...]
    }
    [...]
}

আমি আশা করি এটি কাউকে সহায়তা করবে :)


2

আমার এমভিসি সাইট কনফিগারেশনের জন্য এটি ঠিক আমার প্রয়োজন ছিল!

আতিফ আজিজের পরামর্শ অনুসারে OnExceptionএকাধিক HandleErrorAttributeদৃষ্টান্ত পরিচালনা করার জন্য আমি পদ্ধতিতে কিছুটা পরিবর্তন করেছি ification

মনে রাখবেন যে আপনার যদি খেয়াল রাখতে হবে যে যদি একাধিক HandleErrorAttributeউদাহরণ কার্যকর হয় তবে ডুপ্লিকেট লগিং না ঘটে।

context.ExceptionHandledবেস ক্লাসটি চালাবার আগে আমি কেবল যাচাই করে দেখি , বর্তমান হ্যান্ডলারের আগে অন্য কেউ ব্যতিক্রম পরিচালনা করেছে কিনা তা জানতে।
এটি আমার পক্ষে কাজ করে এবং আমি অন্য কারওর প্রয়োজনে কোডটি পোস্ট করি এবং যদি আমি কিছু উপেক্ষা করে কিনা কেউ জানে কিনা তা জিজ্ঞাসা করতে।

আশা করি এটি কার্যকর:

public override void OnException(ExceptionContext context)
{
    bool exceptionHandledByPreviousHandler = context.ExceptionHandled;

    base.OnException(context);

    Exception e = context.Exception;
    if (exceptionHandledByPreviousHandler
        || !context.ExceptionHandled  // if unhandled, will be logged anyhow
        || RaiseErrorSignal(e)        // prefer signaling, if possible
        || IsFiltered(context))       // filtered?
        return;

    LogException(e);
}

আপনার কাছে ভিত্তি শুরু করার আশেপাশে একটি "যদি" বক্তব্য আছে বলে মনে হয় না nঅনেক্সপশন () .... এবং (ব্যতিক্রমহ্যান্ডলবায়প্রাইস হ্যান্ডলার ||! প্রসঙ্গ। এক্সেকশনহ্যান্ডল || ...) একে অপরকে বাতিল করুন এবং সর্বদা সত্য হবে। আমি কিছু অনুপস্থিত করছি?
joelvh

প্রথমে আমি পরীক্ষা করে থাকি যে কারেন্টের আগে আহ্বান করা অন্য কোনও হ্যান্ডলার ব্যতিক্রমটি পরিচালনা করেছে এবং আমি ফলটি পরিবর্তনশীলটিতে সংরক্ষণ করি: ব্যতিক্রমহ্যান্ডলার্ডবিপ্রিরিউশ হ্যান্ডলার। তারপরে আমি বর্তমান হ্যান্ডলারটিকে ব্যতিক্রমটি নিজেই পরিচালনা করার সুযোগ দিই: বেস.অনেক্সেপশন (প্রসঙ্গ)।
ইলমাটে

প্রথমে আমি পরীক্ষা করে থাকি যে কারেন্টের আগে আহ্বান করা অন্য কোনও হ্যান্ডলার ব্যতিক্রমটি পরিচালনা করেছে এবং আমি ফলটি পরিবর্তনশীলটিতে সংরক্ষণ করি: ব্যতিক্রমহ্যান্ডলার্ডবিপ্রিরিউশ হ্যান্ডলার। তারপরে আমি বর্তমান হ্যান্ডলারটিকে ব্যতিক্রমটি নিজেই পরিচালনা করার সুযোগ দিই: বেস.অনেক্সেপশন (প্রসঙ্গ)। যদি ব্যতিক্রমটি আগে পরিচালিত না হয় তবে এটি হতে পারে: 1 - এটি বর্তমান হ্যান্ডলার দ্বারা পরিচালিত হয়, তারপরে: exceptionHandledByPreLiveHandler = মিথ্যা এবং! প্রসঙ্গ x এক্সেক্সশনহ্যান্ডলড = মিথ্যা 2 - এটি বর্তমান হ্যান্ডলার দ্বারা পরিচালিত নয় এবং: ব্যতিক্রমহ্যান্ডলবায়প্রিরিহ্যান্ডলার = মিথ্যা এবং! প্রসঙ্গ। ব্যতিক্রমহ্যান্ডল সত্য। শুধুমাত্র কেস 1 লগ হবে।
ইলমেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.