এএসপি.নেট কাস্টম ত্রুটি পৃষ্ঠা - সার্ভার.গেটলাস্টআরআর () বাতিল


112

আমার অ্যাপ্লিকেশনটির জন্য আমার একটি কাস্টম ত্রুটি পৃষ্ঠা সেট আপ হয়েছে:

<customErrors mode="On" defaultRedirect="~/errors/GeneralError.aspx"
/>

গ্লোবাল.এক্সএক্স, অ্যাপ্লিকেশন_এরআর () এ, নিম্নলিখিত কোডগুলি ব্যতিক্রমের বিশদ পাওয়ার জন্য কাজ করে:

  Exception ex = Server.GetLastError();
  if (ex != null)
    {
        if (ex.GetBaseException() != null)
            ex = ex.GetBaseException();
    }

আমি আমার ত্রুটি পৃষ্ঠাতে পৌঁছানোর সময় (errors / ত্রুটি / জেনারেলরার.এএসপিএক্স.সি), সার্ভার.গেটলাস্টআরার () বাতিল

গ্লোবাল.এক্সএক্স.এস-এর পরিবর্তে ত্রুটি পৃষ্ঠায় আমি কীভাবে ব্যতিক্রমের বিবরণ পেতে পারি?

ভিস্তা / আইআইএস 7 এএসপি.নেট 3.5


ক্যাসিনি
মার্সেল

নিশ্চিত উত্তর হিসাবে "<কাস্টমআররিস মোড =" রিমোটঅনলি "ডিফল্টরেডাইরেক্ট =" ~ / ত্রুটিগুলি / জেনারেলর.আসপিএক্স "পুনঃনির্দেশমোড =" রেসপন্সরাইভারিট "/>" যুক্ত করুন
elle0087

উত্তর:


137

আমার ওয়েবকনফিগ সেটআপটি আরও ঘনিষ্ঠভাবে দেখছেন, এই পোস্টের একটি মন্তব্য খুব সহায়ক

এ্যাসপনেট ৩.৫ এসপি-তে একটি নতুন প্যারামিটার রিডাইরেক্টমোড রয়েছে

সুতরাং আমরা customErrorsএই প্যারামিটারটি যুক্ত করতে সংশোধন করতে পারি :

<customErrors mode="RemoteOnly" defaultRedirect="~/errors/GeneralError.aspx" redirectMode="ResponseRewrite" />

ResponseRewriteমোড আমাদের ব্রাউজার পুনঃনির্দেশিত ছাড়া «ত্রুটি পাতা» লোড করতে, তাই URL টি থাকার বিষয়টি মতেই একই অনুমতি দেয়, এবং আমার জন্য গুরুত্বপূর্ণ হল, ব্যতিক্রম তথ্য হারিয়ে না হয়।


4
এটি আমার পক্ষে কাজ করে না। ব্যতিক্রম তথ্য হারিয়ে গেছে। আমি এটিকে অ্যাপ্লিকেশন_আররে () এ সেশনে সংরক্ষণ করব এবং এটিকে আমার ত্রুটি পৃষ্ঠার পেজ_ল্ড () হ্যান্ডলারে ফিরিয়ে আনব।
ব্রায়ানক

2
সমস্ত ডকুমেন্টেশনের ক্ষেত্রে এটি আদর্শ হওয়া উচিত। এটি এত ভাল যে আমি আর পুরানো আচরণকে সমর্থন করার কোনও কারণ দেখতে পাচ্ছি না। যতক্ষণ স্থিতি কোডটি সঠিক থাকে ততক্ষণ মূল অনুরোধ URL টি অক্ষত রেখে কোনও সমস্যা নেই (ব্রাউজার পুনঃনির্দেশ না করা)। প্রকৃতপক্ষে এটি HTTP অনুযায়ী আরও সঠিক কারণ প্রতিক্রিয়া কোডটি অনুরোধ করা URL- এর সাথে সম্পর্কিত, ভাগ করা ত্রুটি পৃষ্ঠার অনুরোধ নয়। পয়েন্টারের জন্য ধন্যবাদ আমি নতুন বৈশিষ্ট্যটি মিস করেছি!
টনি ওয়াল

এটি অভ্যন্তরীণ নিয়ন্ত্রণগুলির দ্বারা ট্রিগারযুক্ত ব্যতিক্রমগুলির সাথে কাজ করে না UpdatePanel; ত্রুটি পৃষ্ঠা আর প্রদর্শিত হবে না।
স্যাম

2
যেহেতু এটির পুরানো উত্তরটি এএসপি.নেট in.
সুন্দ্রা প্রুবু

38

ঠিক আছে, আমি এই পোস্টটি পেয়েছি: http://msdn.microsoft.com/en-us/library/aa479319.aspx

এই খুব চিত্রিত চিত্র সহ:

নকশা
(সূত্র: মাইক্রোসফট.কম )

সংক্ষেপে, exception ব্যতিক্রমগুলির বিশদটি পেতে আমার নিজের কাস্টম ত্রুটি পৃষ্ঠায় পরে পুনরুদ্ধারের জন্য গ্লোবাল.এক্সএক্সে এগুলি সংরক্ষণ করতে হবে।

গ্লোবাল.অ্যাসাক্সে কাস্টম ত্রুটি পৃষ্ঠাগুলি যুক্তির চেয়ে সহায়ক সামগ্রীকে পরিচালনা করার মাধ্যমে বেশিরভাগ কাজই করা সবচেয়ে ভাল উপায় বলে মনে হয়।


18

নেলটাইডাউন এবং ভিক্টর যা বলেছে তার সংমিশ্রণ। পছন্দসই / সহজতম উপায় হ'ল ত্রুটি সঞ্চয় করতে আপনার গ্লোবাল.এক্স্যাক্স ব্যবহার করা এবং তারপরে আপনার কাস্টম ত্রুটি পৃষ্ঠাতে পুনর্নির্দেশ করা irect

Global.asax :

    void Application_Error(object sender, EventArgs e) 
{
    // Code that runs when an unhandled error occurs
    Exception ex = Server.GetLastError();
    Application["TheException"] = ex; //store the error for later
    Server.ClearError(); //clear the error so we can continue onwards
    Response.Redirect("~/myErrorPage.aspx"); //direct user to error page
}

তদতিরিক্ত , আপনাকে আপনার ওয়েবকনফিগ সেট আপ করতে হবে :

  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="~/myErrorPage.aspx">
    </customErrors>
  </system.web>

এবং অবশেষে, আপনার ত্রুটি পৃষ্ঠায় আপনি যে ব্যতিক্রম সঞ্চিত করেছেন সেগুলি দিয়ে আপনার যা প্রয়োজন তা করুন :

protected void Page_Load(object sender, EventArgs e)
{

    // ... do stuff ...
    //we caught an exception in our Global.asax, do stuff with it.
    Exception caughtException = (Exception)Application["TheException"];
    //... do stuff ...
}

35
আপনি যদি এটি অ্যাপ্লিকেশনটিতে সঞ্চয় করেন তবে সিস্টেমের অন্য সমস্ত ব্যবহারকারীদের সম্পর্কে। এটি অধিবেশন করা উচিত নয়?
ব্রায়ানকে

11
প্রকৃতপক্ষে, এটি অ্যাপ্লিকেশন ["প্রত্যাশা"] এ সঞ্চয় করে রাখা একটি সত্যই খারাপ পন্থা
জুনিয়র মেহে

4
এছাড়াও, আপনি যদি ব্যবহারকারী হিসাবে একাধিক "ট্যাব" সমর্থন করতে চান, আপনি ব্যতিক্রম সেশন স্টোরটিতে একটি অনন্য কী দিতে এবং তারপরে ত্রুটি পৃষ্ঠায় পুনর্নির্দেশের সময় সেই কীটিকে ক্যোয়ারিং স্ট্রিং প্যারামিটার হিসাবে অন্তর্ভুক্ত করতে পারেন।
Anders Fjeldstad

5
+1 তবে সচেতন হন যে Application[]এটি একটি বিশ্বব্যাপী অবজেক্ট। তাত্ত্বিকভাবে আপনার কাছে এমন একটি দৌড় অবস্থা হতে পারে যেখানে দ্বিতীয় পৃষ্ঠায় ত্রুটিটি ওভাররাইট করে। যাইহোক, যেহেতু Session[]সর্বদা ত্রুটি শর্তের অধীনে উপলব্ধ হয় না, আমি মনে করি এটি আরও ভাল পছন্দ।
Andomar

3
ব্যতিক্রমগুলি সঞ্চয় করতে ব্যবহৃত কীটিতে কেবল একটি নতুন জিআইডি উপসর্গ যুক্ত করুন এবং কাস্টম ত্রুটি পৃষ্ঠায় জিইউইডিটিকে প্যারামিটার হিসাবে পাস করুন।
স্টিভজিএসডি

6

গ্লোবাল.এক্সএক্স.সি.এস Server.Transfer("~/ErrorPage.aspx");এর Application_Error()পদ্ধতির মধ্যে থেকে কিছু ব্যবহার করার চেষ্টা করুন

তারপরে Page_Load()ত্রুটিপেজ.এএসপিএক্স.সি এর মধ্যে থেকে আপনার মতো কিছু করা ঠিক হবে:Exception exception = Server.GetLastError().GetBaseException();

Server.Transfer() ব্যতিক্রম চারপাশে ঝুলন্ত মনে হচ্ছে।


এইভাবে আমার অ্যাপ্লিকেশন এটি করেছে এবং এটি 99% ত্রুটির জন্য বেশ ভাল কাজ করেছে। কিন্তু আজ আমি একটি ব্যতিক্রম পাই যা রেন্ডারিং পদক্ষেপের সময় ঘটে across আপনি যদি Server.Transferকোনও পৃষ্ঠা অর্ধেক উপস্থাপনের পরে থাকেন তবে আপনার যে পৃষ্ঠায় স্থানান্তরিত হবে তার এইচটিএমএল ইতিমধ্যে রেন্ডার করা যা কিছু হয়েছে তার সাথে সহজভাবে জড়িত। সুতরাং আপনি তার নীচের ত্রুটি পৃষ্ঠাটি অনুসরণ করে অর্ধ ভাঙ্গা পৃষ্ঠাটি শেষ করতে পারেন।
কেভিন

কোনও কারণে, সার্ভারে কল করুন rans ট্রান্সফার () সমস্যার কারণ এবং ত্রুটি মোটেই প্রদর্শিত হয় না। এবং তাই, আমি এই পদ্ধতিটি ব্যবহার করার পরামর্শ দিচ্ছি না। উপরে বর্ণিত হিসাবে কেবল ওয়েবকনফিগ লাইনটি ব্যবহার করুন (<কাস্টমআররিস মোড = "রিমোটঅনলি" ডিফল্টরাইর্ড = "~ / ত্রুটিগুলি / জেনারেলর.অ্যাস্পেক্স" রিডাইরেক্টমোড = "রেসপন্সরাইওয়াইট" />) এবং এটি সূক্ষ্মভাবে কাজ করে
নরেশ মিতাল

5

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


1
আমার ক্ষেত্রে আমি কেবল ব্যাক এন্ড ব্যবহারের জন্য ব্যতিক্রমের তথ্য চেয়েছিলাম, তবে এটি ভাল পরামর্শ।
নাইলিটডাউন

2
প্রশ্নের উত্তর দেয় না।
আর্ন এভার্টসন

5

এই আমার সমাধান ..

Global.aspx এ:

void Application_Error(object sender, EventArgs e)
    {
        // Code that runs when an unhandled error occurs

        //direct user to error page 
        Server.Transfer("~/ErrorPages/Oops.aspx"); 
    }

ওপস.এএসপেক্সে:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadError(Server.GetLastError()); 
    }

    protected void LoadError(Exception objError)
    {
        if (objError != null)
        {
            StringBuilder lasterror = new StringBuilder();

            if (objError.Message != null)
            {
                lasterror.AppendLine("Message:");
                lasterror.AppendLine(objError.Message);
                lasterror.AppendLine();
            }

            if (objError.InnerException != null)
            {
                lasterror.AppendLine("InnerException:");
                lasterror.AppendLine(objError.InnerException.ToString());
                lasterror.AppendLine();
            }

            if (objError.Source != null)
            {
                lasterror.AppendLine("Source:");
                lasterror.AppendLine(objError.Source);
                lasterror.AppendLine();
            }

            if (objError.StackTrace != null)
            {
                lasterror.AppendLine("StackTrace:");
                lasterror.AppendLine(objError.StackTrace);
                lasterror.AppendLine();
            }

            ViewState.Add("LastError", lasterror.ToString());
        }
    }

   protected void btnReportError_Click(object sender, EventArgs e)
    {
        SendEmail();
    }

    public void SendEmail()
    {
        try
        {
            MailMessage msg = new MailMessage("webteam", "webteam");
            StringBuilder body = new StringBuilder();

            body.AppendLine("An unexcepted error has occurred.");
            body.AppendLine();

            body.AppendLine(ViewState["LastError"].ToString());

            msg.Subject = "Error";
            msg.Body = body.ToString();
            msg.IsBodyHtml = false;

            SmtpClient smtp = new SmtpClient("exchangeserver");
            smtp.Send(msg);
        }

        catch (Exception ex)
        {
            lblException.Text = ex.Message;
        }
    }

4

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

আমি এখনও ওয়েব ফার্ম কনফিগারেশনে এই সমস্যার একটি নির্ভরযোগ্য সমাধান খুঁজছি, এবং / বা এমএসের কাছ থেকে আপনি কেন কেবল কাস্টম ত্রুটি পৃষ্ঠায় সার্ভার.গেটলাস্টার এর ব্যতিক্রমটি বেছে নিতে পারবেন না তা সম্পর্কে একটি ভাল ব্যাখ্যা খুঁজছেন can গ্লোবাল.এক্সএক্স অ্যাপ্লিকেশন_আররে।

PS অ্যাপ্লিকেশন সংগ্রহের মধ্যে ডেটা প্রথমে লক না করে এবং পরে এটি আনলক না করে সঞ্চয় করা নিরাপদ।


আপনি যদি ক্লায়েন্ট-সাইড রিডাইরেক্ট করে থাকেন তবে এটি কেবল তখনই ঘটবে। সার্ভার-ট্রান্সফার করার সময়, এটি সমস্ত এক অনুরোধের অংশ, সুতরাং প্রয়োগ_আরআর -> পৃষ্ঠা_লোড সমস্ত ক্রমে এক এক সার্ভারে ঘটবে।
ডেভওয়াস্টে

2

এটি নীচে এই 2 টি বিষয়ের সাথে সম্পর্কিত, আমি ত্রুটি পৃষ্ঠায় getHtmlErrorMessage এবং সেশন উভয়ই পেতে চাই।

রেসপন্সরাইরাইটের পরে সেশনটি শূন্য

কেন HTTPContext. সেশন নাল যখন redirectMode = রেসপন্সরাইরাইট

আমি চেষ্টা করে দেখেছি যে সমাধানটি দরকার নেই Server.Transfer() or Response.Redirect()

প্রথম: ওয়েবকনফাইগে রেসপন্সরাইভারিট সরান

Web.config

<customErrors defaultRedirect="errorHandler.aspx" mode="On" />

তারপরে Global.asax as

    void Application_Error(object sender, EventArgs e)
    {
         if(Context.IsCustomErrorEnabled)
         {     
            Exception ex = Server.GetLastError();
            Application["TheException"] = ex; //store the error for later
         }
    }

তারপরে ত্রুটিহ্যান্ডেলআরএসপিএক্স.সি

        protected void Page_Load(object sender, EventArgs e)
            {       
                string htmlErrorMessage = string.Empty ;
                Exception ex = (Exception)Application["TheException"];
                string yourSessionValue = HttpContext.Current.Session["YourSessionId"].ToString();

                //continue with ex to get htmlErrorMessage 
                if(ex.GetHtmlErrorMessage() != null){              
                    htmlErrorMessage = ex.GetHtmlErrorMessage();
                }   
                // continue your code
            }

রেফারেন্সের জন্য

http://www.developer.com/net/asp/article.php/3299641/ServerTransfer-Vs-ResponseRedirect.htm


2

এটা আমার জন্য কাজ করেছে। এমভিসি 5 এ


ভিতরে ~\Global.asax

void Application_Error(object sender, EventArgs e)
{
    FTools.LogException();
    Response.Redirect("/Error");
}


মধ্যে ~\Controllersতৈরি করুনErrorController.cs

using System.Web.Mvc;

namespace MVC_WebApp.Controllers
{
    public class ErrorController : Controller
    {
        // GET: Error
        public ActionResult Index()
        {
            return View("Error");
        }
    }
}


মধ্যে ~\Modelsতৈরি করুনFunctionTools.cs

using System;
using System.Web;

namespace MVC_WebApp.Models
{
    public static class FTools
    {
        private static string _error;
        private static bool _isError;

        public static string GetLastError
        {
            get
            {
                string cashe = _error;
                HttpContext.Current.Server.ClearError();
                _error = null;
                _isError = false;
                return cashe;
            }
        }
        public static bool ThereIsError => _isError;

        public static void LogException()
        {
            Exception exc = HttpContext.Current.Server.GetLastError();
            if (exc == null) return;
            string errLog = "";
            errLog += "**********" + DateTime.Now + "**********\n";
            if (exc.InnerException != null)
            {
                errLog += "Inner Exception Type: ";
                errLog += exc.InnerException.GetType() + "\n";
                errLog += "Inner Exception: ";
                errLog += exc.InnerException.Message + "\n";
                errLog += "Inner Source: ";
                errLog += exc.InnerException.Source + "\n";
                if (exc.InnerException.StackTrace != null)
                {
                    errLog += "\nInner Stack Trace: " + "\n";
                    errLog += exc.InnerException.StackTrace + "\n";
                }
            }
            errLog += "Exception Type: ";
            errLog += exc.GetType().ToString() + "\n";
            errLog += "Exception: " + exc.Message + "\n";
            errLog += "\nStack Trace: " + "\n";
            if (exc.StackTrace != null)
            {
                errLog += exc.StackTrace + "\n";
            }
            _error = errLog;
            _isError = true;
        }
    }
}


মধ্যে ~\Viewsফোল্ডার তৈরি করুন Error এবং ~\Views\Errorতৈরি করুনError.cshtml

@using MVC_WebApp.Models
@{
    ViewBag.Title = "Error";
    if (FTools.ThereIsError == false)
    {
        if (Server.GetLastError() != null)
        {
            FTools.LogException();
        }
    }
    if (FTools.ThereIsError == false)
    {
        <br />
        <h1>No Problem!</h1>
    }
    else
    {
        string log = FTools.GetLastError;
        <div>@Html.Raw(log.Replace("\n", "<br />"))</div>
    }
}


আপনি যদি এই ঠিকানা লিখুন localhost/Error ত্রুটি ছাড়াই পৃষ্ঠা খুলুন



এবং যদি একটি ত্রুটি ঘটে ত্রুটি ঘটে

ত্রুটিগুলি প্রদর্শন করার পরিবর্তে, ডাটাবেসে ভেরিয়েবল 'লগ' রাখতে হবে


সূত্র: মাইক্রোসফ্ট এএসপি ডট নেট


1

আমি মনে করি আপনার কাছে এখানে বেশ কয়েকটি বিকল্প রয়েছে।

আপনি সেশনটিতে শেষ ব্যতিক্রমটি সঞ্চয় করতে পারেন এবং এটি আপনার কাস্টম ত্রুটি পৃষ্ঠা থেকে পুনরুদ্ধার করতে পারেন; অথবা আপনি কেবল অ্যাপ্লিকেশন_রর ইভেন্টের মধ্যে আপনার কাস্টম ত্রুটি পৃষ্ঠায় পুনর্নির্দেশ করতে পারেন। আপনি যদি পরবর্তীটি চয়ন করেন তবে আপনি সার্ভার.টান্সফার পদ্ধতিটি ব্যবহার করেছেন তা নিশ্চিত করতে চান।

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