এএসপি.নেট এমভিসি হ্যান্ডেল এরর


110

আমি কীভাবে [HandleError]asp.net এমভিসি পূর্বরূপ 5 এ ফিল্টারটি নিয়ে যেতে পারি ?
আমি আমার ওয়েবকনফিগ ফাইলে কাস্টমআরার্স সেট করেছি

<customErrors mode="On" defaultRedirect="Error.aspx">
  <error statusCode="403" redirect="NoAccess.htm"/>
  <error statusCode="404" redirect="FileNotFound.htm"/>
</customErrors>

এবং এইভাবে আমার নিয়ন্ত্রণকারী শ্রেণীর উপরে [হ্যান্ডলআরার] রাখুন:

[HandleError]
public class DSWebsiteController: Controller
{
    [snip]
    public ActionResult CrashTest()
    {
        throw new Exception("Oh Noes!");
    }
}

তারপরে আমি আমার নিয়ন্ত্রকদের এই শ্রেণি থেকে উত্তরাধিকারী হতে দিয়েছিলাম এবং তাদের উপর ক্র্যাশটেষ্ট () কল করি call ভিজ্যুয়াল স্টুডিও ত্রুটিটি থামায় এবং f5 চাপার পরেও চালিয়ে যাওয়ার পরে, আমি আবার ত্রুটিযুক্ত হয়েছি Error "'/' অ্যাপ্লিকেশনটিতে সার্ভার ত্রুটি" "404।

এই সাইটটি 3 থেকে 5 এর পূর্বরূপ থেকে পোর্ট করা হয়েছিল the ত্রুটি পরিচালনার ব্যতীত সমস্ত কিছুই (পোর্টে তেমন কাজ নয়) চালিত হয়। আমি যখন একটি সম্পূর্ণ নতুন প্রকল্প তৈরি করি ত্রুটি পরিচালনার কাজটি মনে হয়।

ধারনা?

- দ্রষ্টব্য -
যেহেতু এই প্রশ্নের এখন 3K এর বেশি মতামত রয়েছে, তাই আমি ভেবেছিলাম যে আমি বর্তমানে যা করছি (এএসপি.নেট এমভিসি 1.0) ব্যবহার করে রাখাই সুবিধাজনক হবে। ইন MVC contrib প্রকল্পের একটি উজ্জ্বল বৈশিষ্ট্য "RescueAttribute" বলা আপনি সম্ভবত তা খুব পরীক্ষা করা উচিত নেই;)


RescueAttributeউত্সের লিঙ্ক : mvccontrib.codeplex.com/SourceControl/changeset/view/…
পিটার

উত্তর:


158
[HandleError]

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

[HandleError(ExceptionType = typeof(SqlException), View = "DatabaseError")]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "LameErrorHandling")]

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

আরও তথ্যের জন্য, এটি সম্পর্কে স্কট গুথ্রির ব্লগ পোস্টটি একবার দেখুন ।


1
বর্ধিত তথ্যের জন্য ধন্যবাদ। আমি জানি না আমি কী ভুল করেছি, তবে আমি একটি নতুন প্রকল্প তৈরি করেছি, এতে বিদ্যমান সমস্ত দর্শন, নিয়ন্ত্রণকারী এবং মডেলগুলি পোর্ট করেছি এবং এখন এটি কার্যকর হয় works যদিও নির্বাচক দৃষ্টিভঙ্গি সম্পর্কে জানতেন না।
বোরিস কলেনস

যদি এই ব্যতিক্রমগুলি লগইন করা পছন্দসই হয় তবে ভিউয়ের পিছনে একটি কোডবিহীন যুক্ত করার জন্য এটি কি গ্রহণযোগ্য জায়গা হবে?
পিটার জে

6
আইকনিক, এখানে আপনার মন্তব্যের জবাব "আমার তুলনায় আরও বেশি ভাল": আপনি পরিবর্তে হ্যান্ডলিররঅ্যাট্রিবিউট সাবক্লাস করতে পারেন এবং এর "অন্যাক্সেপশন" পদ্ধতিটি ওভাররাইড করতে পারেন: তারপরে, আপনার পছন্দসই লগিং বা কাস্টম ক্রিয়াগুলি সন্নিবেশ করুন। এরপরে আপনি সম্পূর্ণরূপে ব্যতিক্রমটি হ্যান্ডেল করতে পারেন (প্রসঙ্গ নির্ধারণ করুন x ধারণাটি সত্য রূপে প্রত্যাশিত), বা এর জন্য বেস বর্গের নিজস্ব অনএক্সেপশন পদ্ধতিটি পিছিয়ে দিতে পারেন। এখানে একটি চমৎকার নিবন্ধ যা এটির
ফানকা

আমি তাই আমি এই ভিতরে সব ব্যবস্থা করতে সক্ষম কন্ট্রোলার অনেক আছে global.asaxমত এই ব্যবহারকারীর জন্য একটি বার্তা দেখাতে?
শাইজুট

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

23

এটিও লক্ষ করা উচিত যে ত্রুটিগুলি যা HTTP ত্রুটি কোডটি 500 এ সেট করে না

(যেমন অননুমোদিতঅ্যাক্সেস এক্সসেপশন)

HandleError ফিল্টার দ্বারা পরিচালিত হবে না।


1
সত্য, তবে এমভিসির অবদানটিতে রেসকিউঅ্যাট্রিবিউটটি দেখুন (ওপিতে লিংক)
বরিস কলেনস

14

এইচপি ত্রুটি কোড 500 এর সমাধান করার জন্য এটি [ERROR] নামক একটি বৈশিষ্ট্য হিসাবে এটি একটি ক্রিয়াতে রাখে

public class Error: System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(System.Web.Mvc.ExceptionContext filterContext)
    {

            if (filterContext.HttpContext.IsCustomErrorEnabled)
            {
                filterContext.ExceptionHandled = true;

            }
            base.OnException(filterContext);
            //OVERRIDE THE 500 ERROR  
           filterContext.HttpContext.Response.StatusCode = 200;
    }

    private static void RaiseErrorSignal(Exception e)
    {
        var context = HttpContext.Current;
      // using.Elmah.ErrorSignal.FromContext(context).Raise(e, context);
    } 

}

// উদাহরণ:

[Error]
[HandleError]
[PopulateSiteMap(SiteMapName="Mifel1", ViewDataKey="Mifel1")]
public class ApplicationController : Controller
{
}

12

এমভিসি-র বৈশিষ্ট্যগুলি গেট এবং পোস্ট পদ্ধতিতে ত্রুটি পরিচালনা করতে খুব কার্যকর , এটি অজ্যাক্স কলের জন্যও ট্র্যাক করে ।

আপনার অ্যাপ্লিকেশনটিতে একটি বেস নিয়ামক তৈরি করুন এবং এটি আপনার প্রধান নিয়ামক (এমপ্লয়ি কনট্রোলার) এ উত্তরাধিকারী করুন।

পাবলিক ক্লাস কর্মচারী নিয়ন্ত্রণকারী: বেসকন্ট্রোলার

বেস নিয়ামকটিতে কোড নীচে যুক্ত করুন।

/// <summary>
/// Base Controller
/// </summary>
public class BaseController : Controller
{       
    protected override void OnException(ExceptionContext filterContext)
    {
        Exception ex = filterContext.Exception;

        //Save error log in file
        if (ConfigurationManager.AppSettings["SaveErrorLog"].ToString().Trim().ToUpper() == "TRUE")
        {
            SaveErrorLog(ex, filterContext);
        }

        // if the request is AJAX return JSON else view.
        if (IsAjax(filterContext))
        {
            //Because its a exception raised after ajax invocation
            //Lets return Json
            filterContext.Result = new JsonResult()
            {
                Data = Convert.ToString(filterContext.Exception),
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
        }
        else
        {
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();

            filterContext.Result = new ViewResult()
            {
                //Error page to load
                ViewName = "Error",
                ViewData = new ViewDataDictionary()
            };

            base.OnException(filterContext);
        }
    }

    /// <summary>
    /// Determines whether the specified filter context is ajax.
    /// </summary>
    /// <param name="filterContext">The filter context.</param>
    private bool IsAjax(ExceptionContext filterContext)
    {
        return filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest";
    }

    /// <summary>
    /// Saves the error log.
    /// </summary>
    /// <param name="ex">The ex.</param>
    /// <param name="filterContext">The filter context.</param>
    void SaveErrorLog(Exception ex, ExceptionContext filterContext)
    {
        string logMessage = ex.ToString();

        string logDirectory = Server.MapPath(Url.Content("~/ErrorLog/"));

        DateTime currentDateTime = DateTime.Now;
        string currentDateTimeString = currentDateTime.ToString();
        CheckCreateLogDirectory(logDirectory);
        string logLine = BuildLogLine(currentDateTime, logMessage, filterContext);
        logDirectory = (logDirectory + "\\Log_" + LogFileName(DateTime.Now) + ".txt");

        StreamWriter streamWriter = null;
        try
        {
            streamWriter = new StreamWriter(logDirectory, true);
            streamWriter.WriteLine(logLine);
        }
        catch
        {
        }
        finally
        {
            if (streamWriter != null)
            {
                streamWriter.Close();
            }
        }
    }

    /// <summary>
    /// Checks the create log directory.
    /// </summary>
    /// <param name="logPath">The log path.</param>
    bool CheckCreateLogDirectory(string logPath)
    {
        bool loggingDirectoryExists = false;
        DirectoryInfo directoryInfo = new DirectoryInfo(logPath);
        if (directoryInfo.Exists)
        {
            loggingDirectoryExists = true;
        }
        else
        {
            try
            {
                Directory.CreateDirectory(logPath);
                loggingDirectoryExists = true;
            }
            catch
            {
            }
        }

        return loggingDirectoryExists;
    }

    /// <summary>
    /// Builds the log line.
    /// </summary>
    /// <param name="currentDateTime">The current date time.</param>
    /// <param name="logMessage">The log message.</param>
    /// <param name="filterContext">The filter context.</param>       
    string BuildLogLine(DateTime currentDateTime, string logMessage, ExceptionContext filterContext)
    {
        string controllerName = filterContext.RouteData.Values["Controller"].ToString();
        string actionName = filterContext.RouteData.Values["Action"].ToString();

        RouteValueDictionary paramList = ((System.Web.Routing.Route)(filterContext.RouteData.Route)).Defaults;
        if (paramList != null)
        {
            paramList.Remove("Controller");
            paramList.Remove("Action");
        }

        StringBuilder loglineStringBuilder = new StringBuilder();

        loglineStringBuilder.Append("Log Time : ");
        loglineStringBuilder.Append(LogFileEntryDateTime(currentDateTime));
        loglineStringBuilder.Append(System.Environment.NewLine);

        loglineStringBuilder.Append("Username : ");
        loglineStringBuilder.Append(Session["LogedInUserName"]);
        loglineStringBuilder.Append(System.Environment.NewLine);

        loglineStringBuilder.Append("ControllerName : ");
        loglineStringBuilder.Append(controllerName);
        loglineStringBuilder.Append(System.Environment.NewLine);

        loglineStringBuilder.Append("ActionName : ");
        loglineStringBuilder.Append(actionName);
        loglineStringBuilder.Append(System.Environment.NewLine);

        loglineStringBuilder.Append("----------------------------------------------------------------------------------------------------------");
        loglineStringBuilder.Append(System.Environment.NewLine);

        loglineStringBuilder.Append(logMessage);
        loglineStringBuilder.Append(System.Environment.NewLine);
        loglineStringBuilder.Append("==========================================================================================================");

        return loglineStringBuilder.ToString();
    }

    /// <summary>
    /// Logs the file entry date time.
    /// </summary>
    /// <param name="currentDateTime">The current date time.</param>
    string LogFileEntryDateTime(DateTime currentDateTime)
    {
        return currentDateTime.ToString("dd-MMM-yyyy HH:mm:ss");
    }

    /// <summary>
    /// Logs the name of the file.
    /// </summary>
    /// <param name="currentDateTime">The current date time.</param>
    string LogFileName(DateTime currentDateTime)
    {
        return currentDateTime.ToString("dd_MMM_yyyy");
    }

}

================================================

ডিরেক্টরিটি সন্ধান করে: রুট / অ্যাপ_স্টার্ট / ফিল্টারকনফিগ.সি

নীচে কোড যুক্ত করুন:

/// <summary>
/// Filter Config
/// </summary>
public class FilterConfig
{
    /// <summary>
    /// Registers the global filters.
    /// </summary>
    /// <param name="filters">The filters.</param>
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}

ট্র্যাক এজেএক্স ত্রুটি:

লেআউট পৃষ্ঠা লোডে চেকএজএক্সএরর ফাংশনটি কল করুন।

function CheckAJAXError() {
    $(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {

        var ex;
        if (String(thrownError).toUpperCase() == "LOGIN") {
            var url = '@Url.Action("Login", "Login")';
            window.location = url;
        }
        else if (String(jqXHR.responseText).toUpperCase().indexOf("THE DELETE STATEMENT CONFLICTED WITH THE REFERENCE CONSTRAINT") >= 0) {

            toastr.error('ReferanceExistMessage');
        }
        else if (String(thrownError).toUpperCase() == "INTERNAL SERVER ERROR") {
            ex = ajaxSettings.url;
            //var url = '@Url.Action("ErrorLog", "Home")?exurl=' + ex;
            var url = '@Url.Action("ErrorLog", "Home")';
            window.location = url;
        }
    });
};

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

@ School.Resource.Messages.ReferanceExist প্যারামিটারটি কী?
জ্যাক 13

@ কোডকাস্টার আপনি কি এএসপি.নেট এমভিসিতে এজেএক্সের সাথে এ জাতীয় ত্রুটি পরিচালনা পদ্ধতি ব্যবহারের জন্য আরও ভাল কোনও উপায় জানেন? কোন সাহায্য দয়া করে?
জ্যাক 13

একটি 400 বা 500 রিটার্ন করুন, যেমন HTTP এর উদ্দেশ্য intended প্রতিক্রিয়া বডিটিতে নির্দিষ্ট স্ট্রিংগুলির জন্য খনন করবেন না।
কোডকাস্টার

@ কোডকাস্টার আপনি কি দয়া করে এই সমস্যার বিষয়ে এমভিসিতে পার্টিশালভিউ ব্যবহার করে গ্লোবাল ত্রুটি পরিচালনা করার বিষয়ে একবার নজর রাখতে পারেন?
জ্যাক

4

আপনি ত্রুটি.এএসপিএক্স হারিয়েছেন :) প্রাকদর্শন 5 এ এটি আপনার দর্শন / ভাগ করা ফোল্ডারে রয়েছে। একটি নতুন প্রাকদর্শন 5 প্রকল্প থেকে এটি অনুলিপি করুন।


উত্তরের জন্য ধন্যবাদ, তবে আমি ইতিমধ্যে ত্রুটি.এসপিএক্স পৃষ্ঠাটি অনুলিপি করেছি। সত্যিই এমন কিছু হতে পারে যা আমি সাধারণত ভুলে যেতাম তবে এবার নয়। : পি
বোরিস কলেনস

-1
    [HandleError]
    public class ErrorController : Controller
    {        
        [AcceptVerbs(HttpVerbs.Get)]
        public ViewResult NotAuthorized()
        {
            //401
            Response.StatusCode = (int)HttpStatusCode.Unauthorized;

        return View();
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public ViewResult Forbidden()
    {
        //403
        Response.StatusCode = (int)HttpStatusCode.Forbidden;

        return View();
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public ViewResult NotFound()
    {
        //404
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View();
    }

    public ViewResult ServerError()
    {
        //500
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View();
    }

}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.