আমি এএসপি.নেট এমভিসিতে 404 কীভাবে সঠিকভাবে পরিচালনা করতে পারি?


432

আমি আরসি 2 ব্যবহার করছি

ইউআরএল রাউটিং ব্যবহার:

routes.MapRoute(
    "Error",
     "{*url}",
     new { controller = "Errors", action = "NotFound" }  // 404s
);

উপরেরগুলি এই জাতীয় অনুরোধগুলির যত্ন নেবে বলে মনে হচ্ছে (প্রাথমিক এমভিসি প্রকল্পের দ্বারা ডিফল্ট রুট টেবিল সেটআপ করা): "/ ব্লাহ / ব্লাহ / ব্লাহ / ব্লাহ"

নিয়ামক নিজেই ওভাররাইডিং হ্যান্ডলঅনজ্ঞানঅ্যাকশন ():

// 404s - handle here (bad action requested
protected override void HandleUnknownAction(string actionName) {
    ViewData["actionName"] = actionName;
    View("NotFound").ExecuteResult(this.ControllerContext);
}  

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

সুতরাং পরিশেষে, আমার প্রশ্ন: এমভিসি কাঠামোর মধ্যে কোনও রুট বা অন্য কোনও কিছু ব্যবহার করে এই জাতীয় অনুরোধটি ধরার কোনও উপায় আছে কি?

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


3
এটি 404 ত্রুটি, আমি এটি নিয়ে মাথা ঘামাই না। এটি 404 প্রদর্শিত যাক সম্ভবত ব্যবহারকারী কিছু ভুল টাইপ করেছেন। বা যদি এটি কিছু সরানো হয় তবে আপনার অ্যাপ্লিকেশনটিকে সেই অনুরোধটি গ্রহণ করা উচিত এবং স্থায়ীভাবে পুনঃনির্দেশ করা উচিত। 404 ওয়েবসারভারের নয় অ্যাপ্লিকেশনটির। আপনি সর্বদা ত্রুটির জন্য iis পৃষ্ঠাগুলি কাস্টমাইজ করতে পারেন।
মামু

আপনি এই সমাধানটিও একবার দেখতে পারেন blog.dantup.com/2009/04/…
বিকাশকারী

ben.onfabrik.com/posts/aspnet-mvc-custom-error-pages এরও কিছু ভাল তথ্য রয়েছে
ক্রিস এস

4
এটি লজ্জাজনক যে 4 টি স্থিতিশীল পরে এবং 5 বছরেরও বেশি সময় পরে মুক্তি পেয়েছে, এসপ নেটওয়্যার এমভিসি + আইআইএস-এ 404s পরিচালনার পরিস্থিতিটি আসলেই উন্নত হয়নি এবং কীভাবে এটি পরিচালনা করতে হবে এটি এখনও প্রশ্নোত্তর।
জোয়েলমদেব

উত্তর:


271

কোডটি http://blogs.microsoft.co.il/blogs/shay/archive/2009/03/06/real-world-error-hadnling-in-asp-net-mvc-rc2.aspx এবং কার্য থেকে নেওয়া হয়েছে এএসপিএনটি এমভিসি 1.0 তেও

এখানে আমি কীভাবে HTTP ব্যতিক্রমগুলি পরিচালনা করব:

protected void Application_Error(object sender, EventArgs e)
{
   Exception exception = Server.GetLastError();
   // Log the exception.

   ILogger logger = Container.Resolve<ILogger>();
   logger.Error(exception);

   Response.Clear();

   HttpException httpException = exception as HttpException;

   RouteData routeData = new RouteData();
   routeData.Values.Add("controller", "Error");

   if (httpException == null)
   {
       routeData.Values.Add("action", "Index");
   }
   else //It's an Http Exception, Let's handle it.
   {
       switch (httpException.GetHttpCode())
       {
          case 404:
              // Page not found.
              routeData.Values.Add("action", "HttpError404");
              break;
          case 500:
              // Server error.
              routeData.Values.Add("action", "HttpError500");
              break;

           // Here you can handle Views to other error codes.
           // I choose a General error template  
           default:
              routeData.Values.Add("action", "General");
              break;
      }
  }           

  // Pass exception details to the target error View.
  routeData.Values.Add("error", exception);

  // Clear the error on server.
  Server.ClearError();

  // Avoid IIS7 getting in the middle
  Response.TrySkipIisCustomErrors = true; 

  // Call target Controller and pass the routeData.
  IController errorController = new ErrorController();
  errorController.Execute(new RequestContext(    
       new HttpContextWrapper(Context), routeData));
}

23
আপডেট: একটি HTTP 404 পরীক্ষা করার জন্য অবশ্যই অবশ্যই প্রয়োজনীয়, তবে আপনি কখনই 500 পাবেন কখনই তা নিশ্চিত নই। এছাড়াও আপনাকে স্পষ্টভাবে রেসপন্সও সেট করতে হবে। স্ট্যাটাসকোড = 404 বা 500 অন্যথায় গুগল এই পৃষ্ঠাগুলি সূচীকরণ শুরু করবে আপনি যদি 200 টি স্ট্যাটাস কোডটি ফিরিয়ে দিচ্ছেন যা এই কোডটি বর্তমানে করছে
সাইমন_উইভার

6
@ সিমন_উইভার: সম্মত! এটির 404 স্থিতি কোডগুলি ফিরিয়ে নেওয়া দরকার। এটি 404 সমাধান হিসাবে মূলত ভেঙে যায় যতক্ষণ না এটি হয়। এটি দেখুন: কোডিংহরর.com
ম্যাট কোকাজ

1
এই পুরো পরামর্শের সাথে অন্তর্নিহিত ত্রুটি রয়েছে - গ্লোবাল.এক্স্যাক্সের সময় কার্যকরভাবে বুঁদ হয়ে গেছে, এইচটিপিপি কনটেক্সট খুব বেশি অনুপস্থিত। উদাহরণস্বরূপ পরামর্শ অনুসারে আপনি আপনার নিয়ন্ত্রকদের কাছে ফিরে যেতে পারবেন না। উপরে ব্লগ লিঙ্কে মন্তব্য দেখুন।
ম্যাট কোকাজ

3
উপরে থেকে কিছু মন্তব্য এবং লিঙ্কযুক্ত পোস্ট উল্লেখ করা হয়েছে, এটি কাজ করে বলে মনে হচ্ছে না। ত্রুটি নিয়ন্ত্রণকারী হিট হয় তবে একটি ফাঁকা স্ক্রিন ফিরে আসে। (
এমভিসি

4
কিছু ঠিক মনে হচ্ছে না, এমভিসির পুরো উদ্দেশ্যটি সেই সমস্ত বিমূর্ততা সরিয়ে ফেলা এবং এখনও এখানে এটি আবার ...
অ্যালেক্স নোলাসকো

255

404 এর জন্য প্রয়োজনীয়তা

নিম্নলিখিত 404 সমাধানের জন্য আমার প্রয়োজনীয়তা এবং নীচে আমি কীভাবে এটি প্রয়োগ করব তা দেখিয়েছি:

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

সমাধান

আমি মনে করি আপনার Application_Errorউচ্চতর জিনিসগুলির জন্য গ্লোবাল.অ্যাসাক্সে সঞ্চয় করা উচিত , যেমন অবিচ্ছিন্ন ব্যতিক্রম এবং লগিং (শ্যা জ্যাকবীর উত্তরের মতো) শোয়ের মতো) তবে 404 হ্যান্ডলিংয়ের মতো নয়। এ কারণেই আমার পরামর্শ 404 টি স্টাফকে Global.asax ফাইলের বাইরে রাখে।

পদক্ষেপ 1: 404-ত্রুটি যুক্তির জন্য একটি সাধারণ জায়গা আছে

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

public class ErrorController : MyController
{
    #region Http404

    public ActionResult Http404(string url)
    {
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        var model = new NotFoundViewModel();
        // If the url is relative ('NotFound' route) then replace with Requested path
        model.RequestedUrl = Request.Url.OriginalString.Contains(url) & Request.Url.OriginalString != url ?
            Request.Url.OriginalString : url;
        // Dont get the user stuck in a 'retry loop' by
        // allowing the Referrer to be the same as the Request
        model.ReferrerUrl = Request.UrlReferrer != null &&
            Request.UrlReferrer.OriginalString != model.RequestedUrl ?
            Request.UrlReferrer.OriginalString : null;

        // TODO: insert ILogger here

        return View("NotFound", model);
    }
    public class NotFoundViewModel
    {
        public string RequestedUrl { get; set; }
        public string ReferrerUrl { get; set; }
    }

    #endregion
}

পদক্ষেপ 2: বেস কন্ট্রোলার ক্লাসটি ব্যবহার করুন যাতে আপনি সহজেই আপনার কাস্টম 404 ক্রিয়াটি শুরু করতে পারেন এবং তারটি আপ করতে পারেন HandleUnknownAction

এএসপি.নেট এমভিসিতে 404 গুলি বেশ কয়েকটি জায়গায় ধরা দরকার। প্রথমটি হচ্ছে HandleUnknownAction

InvokeHttp404পদ্ধতি পুনরায় রাউটিং জন্য একটি সাধারণ জায়গা তৈরি করে ErrorControllerআমাদের নতুন Http404কর্ম। DRY চিন্তা করুন !

public abstract class MyController : Controller
{
    #region Http404 handling

    protected override void HandleUnknownAction(string actionName)
    {
        // If controller is ErrorController dont 'nest' exceptions
        if (this.GetType() != typeof(ErrorController))
            this.InvokeHttp404(HttpContext);
    }

    public ActionResult InvokeHttp404(HttpContextBase httpContext)
    {
        IController errorController = ObjectFactory.GetInstance<ErrorController>();
        var errorRoute = new RouteData();
        errorRoute.Values.Add("controller", "Error");
        errorRoute.Values.Add("action", "Http404");
        errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString);
        errorController.Execute(new RequestContext(
             httpContext, errorRoute));

        return new EmptyResult();
    }

    #endregion
}

পদক্ষেপ 3: আপনার কন্ট্রোলার কারখানায় নির্ভরতা ইনজেকশন ব্যবহার করুন এবং 404 এইচটিপিএক্সেক্সসেপশন ওয়্যার আপ করুন

পছন্দ করুন (এটি স্ট্রাকচারম্যাপ হতে হবে না):

এমভিসি 1.0 উদাহরণ:

public class StructureMapControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(Type controllerType)
    {
        try
        {
            if (controllerType == null)
                return base.GetControllerInstance(controllerType);
        }
        catch (HttpException ex)
        {
            if (ex.GetHttpCode() == (int)HttpStatusCode.NotFound)
            {
                IController errorController = ObjectFactory.GetInstance<ErrorController>();
                ((ErrorController)errorController).InvokeHttp404(RequestContext.HttpContext);

                return errorController;
            }
            else
                throw ex;
        }

        return ObjectFactory.GetInstance(controllerType) as Controller;
    }
}

এমভিসি ২.০ উদাহরণ:

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        try
        {
            if (controllerType == null)
                return base.GetControllerInstance(requestContext, controllerType);
        }
        catch (HttpException ex)
        {
            if (ex.GetHttpCode() == 404)
            {
                IController errorController = ObjectFactory.GetInstance<ErrorController>();
                ((ErrorController)errorController).InvokeHttp404(requestContext.HttpContext);

                return errorController;
            }
            else
                throw ex;
        }

        return ObjectFactory.GetInstance(controllerType) as Controller;
    }

আমি মনে করি ত্রুটিগুলি যেখানে উত্পন্ন হয়েছে তার কাছাকাছি ধরা আরও ভাল। এই কারণেই আমি Application_Errorহ্যান্ডলারের চেয়ে উপরেরটি পছন্দ করি ।

এটি 404s ধরা দ্বিতীয় স্থান।

পদক্ষেপ 4: আপনার অ্যাপ্লিকেশনে পার্স করা যায় না এমন urlগুলির জন্য গ্লোবাল.অ্যাসাক্সে একটি নটফাউন্ড রুট যুক্ত করুন

এই রুটটি আমাদের Http404কর্মের দিকে নির্দেশ করা উচিত । লক্ষ্য করুন যে urlপ্যারামটি আপেক্ষিক url হবে কারণ রাউটিং ইঞ্জিনটি এখানে ডোমেনের অংশটি ছড়িয়ে দিচ্ছে? এজন্য আমাদের প্রথম ধাপে এই সমস্ত শর্তযুক্ত url যুক্তি রয়েছে।

        routes.MapRoute("NotFound", "{*url}", 
            new { controller = "Error", action = "Http404" });

এমভিসি অ্যাপে 404 সেকেন্ড করার জন্য এটি তৃতীয় এবং চূড়ান্ত জায়গা যা আপনি নিজেকে প্রার্থনা করেন না। আপনি যদি এখানে তুলনাহীন রুটগুলি না ধরেন তবে এমভিসি সমস্যাটি এএসপি.এনইটি (গ্লোবাল.অ্যাক্স্যাক্স) পর্যন্ত পৌঁছে দেবে এবং আপনি সত্যিকার অর্থে এই পরিস্থিতিতে চান না।

পদক্ষেপ 5: অবশেষে, 404 সেকেন্ড করুন যখন আপনার অ্যাপ্লিকেশনটি কিছু খুঁজে না পাবে

যখন আমার controlণ নিয়ন্ত্রকের কাছে কোনও খারাপ আইডি জমা দেওয়া হয় (যেমন উত্পন্ন হয় MyController):

    //
    // GET: /Detail/ID

    public ActionResult Detail(int ID)
    {
        Loan loan = this._svc.GetLoans().WithID(ID);
        if (loan == null)
            return this.InvokeHttp404(HttpContext);
        else
            return View(loan);
    }

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

এখনও পর্যন্ত প্রতিক্রিয়া জন্য ধন্যবাদ। আমি আরও পেতে চাই।

দ্রষ্টব্য: এটি আমার মূল উত্তর থেকে উল্লেখযোগ্যভাবে সম্পাদনা করা হয়েছে তবে উদ্দেশ্য / প্রয়োজনীয়তাগুলি একই - এই কারণেই আমি একটি নতুন উত্তর যুক্ত করি নি


12
সম্পূর্ণ লেখার জন্য ধন্যবাদ। একটি সংযোজন হ'ল আইআইএস under এর অধীনে চলাকালীন আপনাকে "ট্রাইস্কিপিসিসটাস্টম এয়ারিয়ারস" সম্পত্তিটি সেট করতে হবে। অন্যথায় আইআইএস তবুও ডিফল্ট 404 পৃষ্ঠা ফিরে আসবে। আমরা রেসপন্স যোগ করেছি ry ট্রাইস্কিপআইআইইস কাস্টমআরিয়ারস = সত্য; পদক্ষেপ কোড নির্ধারণ করে পদক্ষেপ 5-এ রেখার পরে। msdn.microsoft.com/en-us/library/…
রিক

1
@ রায়ান ওয়েবকনফিগের customErrorsবিভাগটি স্ট্যাটিক পুনর্নির্দেশ পৃষ্ঠাগুলি সংজ্ঞায়িত করে যেগুলি যদি আইআইএস না হয় তবে উচ্চতর স্তরে অ্যাস্পেটে পরিচালিত হয়। ফলাফলটি এমভিসি ভিউ হওয়ার দরকার হিসাবে আমি যা চেয়েছিলাম তা এটি নয় (যাতে আমি তাদের মধ্যে ডেটা রাখতে পারি))। আমি customErrorsস্পষ্টতই বলব না যে " এমভিসিতে অপ্রচলিত" তবে আমার এবং এই 404 সমাধানটি তারা অবশ্যই।
ম্যাট কোকাজ

1
এছাড়াও, কেউ স্ট্রাকচার্যাপ ব্যবহার না করে তাই পদক্ষেপ 3 আপডেট করতে পারে? সম্ভবত আপনি একটি জেনেরিক কন্ট্রোলার ফ্যাক্টরি যা ইতিমধ্যে কোনও কন্ট্রোলার ফ্যাক্টরি ব্যবহার না করে থাকলে তা কার্যকর করা সহজ।
ডেভিড মারডোক

7
এটি এমভিসি 3 এর জন্য সূক্ষ্ম কাজ করে। আমি পরিবর্তে ObjectFactory.GetInstanceএমভিসি 3 এর DependencyResolver.Current.GetServiceপরিবর্তন করেছি যাতে এটি আরও জেনেরিক। আমি নিনজেক্ট ব্যবহার করছি।
কামরানিকাস

122
404 এর মতো একটি সাধারণ ওয়েব ফ্রেমওয়ার্কের মতো সাধারণ জিনিসটি এত রক্তাক্ত জটিল বলে অন্য কাউকে কি এটুকু উন্মাদ বলে মনে হয়?
কোয়ান্টিন-স্টারিন

235

এএসপি.নেট এমভিসি খুব ভাল কাস্টম 404 পৃষ্ঠা সমর্থন করে না। কাস্টম কন্ট্রোলার কারখানা, ক্যাপ-অল রুট, বেস কন্ট্রোলার ক্লাস HandleUnknownAction- আর্গ!

আইআইএস কাস্টম ত্রুটি পৃষ্ঠাগুলি এখন পর্যন্ত আরও ভাল বিকল্প:

web.config

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" />
    <error statusCode="404" responseMode="ExecuteURL" path="/Error/PageNotFound" />
  </httpErrors>
</system.webServer>

ErrorController

public class ErrorController : Controller
{
    public ActionResult PageNotFound()
    {
        Response.StatusCode = 404;
        return View();
    }
}

নমুনা প্রকল্প


38
এই উত্তর দেওয়া উচিত হবে !!! আইআইএস এক্সপ্রেসের সাথে এএসপি.এনইটি এমভিসি 3 তে দুর্দান্ত কাজ করে।
আন্দ্রে রেনিয়া

7
আপনি যদি আইআইএস using ব্যবহার করেন তবে এটি অবশ্যই যাওয়ার উপায়। +1 টি!
e8080ka

3
আপনি যখন একই প্রকল্পের মধ্যে জেএসএন-তে কাজ করছেন তখন কি কেবল 404 স্ট্যাটাসটি পাওয়া সম্ভব?
VinnyG

6
এটি আইআইএস এক্সপ্রেসে দুর্দান্ত কাজ করছে তবে আমি আইআইএস 7.5 প্রোডাকশনে সাইটটি স্থাপন করার সাথে সাথেই আমি পেয়ে যাচ্ছি সমস্ত ত্রুটি দেখার পরিবর্তে একটি সাদা পৃষ্ঠা।
মোল্দে

2
আমার পরীক্ষাগুলি অনুসারে (এমভিসি 3 সহ) এটি কার্যকর হওয়ার customErrors mode="On"সাথে সাথে একসাথে ব্রেক হয় HandleErrorAttribute। নিয়ামক ক্রিয়াকলাপে হাতছাড়া হওয়া ব্যতিক্রমগুলির জন্য কাস্টম ত্রুটি পৃষ্ঠাগুলি আর পরিবেশিত হয় না।
স্লুমা

153

দ্রুত উত্তর / টিএল; ডিআর

এখানে চিত্র বর্ণনা লিখুন

অলস লোকদের জন্য সেখানে:

Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0

তারপরে এই লাইনটি সরান global.asax

GlobalFilters.Filters.Add(new HandleErrorAttribute());

এবং এটি কেবল আইআইএস 7 + এবং আইআইএস এক্সপ্রেসের জন্য।

আপনি যদি ক্যাসিনি ব্যবহার করেন .. ভাল .. উম .. এর .. বিশ্রী ... বিশ্রী


দীর্ঘ, ব্যাখ্যা উত্তর

আমি জানি এই উত্তর দেওয়া হয়েছে। তবে উত্তরটি হ'ল সত্যই সরল ( ডেভিড ফোলার এবং ড্যামিয়ান এডওয়ার্ডসকে উত্সাহিত) সত্যই )।

নেই কিছু কাস্টম করতে কোন প্রয়োজন

জন্য ASP.NET MVC3, সমস্ত বিট এবং টুকরা আছে।

পদক্ষেপ 1 -> আপনার ওয়েবকনফিগটি টিডব্লিউও স্পটে আপডেট করুন।

<system.web>
    <customErrors mode="On" defaultRedirect="/ServerError">
      <error statusCode="404" redirect="/NotFound" />
    </customErrors>

এবং

<system.webServer>
    <httpErrors errorMode="Custom">
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
    </httpErrors>    

...
<system.webServer>
...
</system.web>

আমি যে রুটগুলি ব্যবহার করার সিদ্ধান্ত নিয়েছি সে সম্পর্কে এখন সাবধান নোট করুন। আপনি কিছু ব্যবহার করতে পারেন, তবে আমার রুটগুলি

  • /NotFound <- একটি 404 পাওয়া যায় নি, ত্রুটি পৃষ্ঠা।
  • /ServerError<- অন্য কোনও ত্রুটির জন্য, আমার কোডে ঘটে যাওয়া ত্রুটিগুলি অন্তর্ভুক্ত করুন। এটি একটি 500 অভ্যন্তরীণ সার্ভার ত্রুটি

<system.web>কেবলমাত্র প্রথম বিভাগে কীভাবে একটি কাস্টম প্রবেশ রয়েছে? statusCode="404"এন্ট্রি? আমি কেবলমাত্র একটি স্থিতি কোডটি তালিকাভুক্ত করেছি কারণ 500 Server Error( অন্যান্য errors ত্রুটিযুক্ত ত্রুটি ঘটবে যখন আপনার কোডটিতে কোনও বাগ থাকে এবং ব্যবহারকারীর অনুরোধ ক্র্যাশ হয়ে যায়) .. অন্যান্য সমস্ত ত্রুটিগুলি সেটিংস দ্বারা পরিচালিত হয় defaultRedirect="/ServerError".. যা বলে , যদি আপনি 404 পৃষ্ঠা না পাওয়া যায় তবে দয়া করে এই পথে যান/ServerError

ঠিক আছে. যে উপায় বাইরে .. এখন তালিকাভুক্ত আমার রুটglobal.asax

পদক্ষেপ 2 - গ্লোবাল.এক্সএক্সে রুট তৈরি করা

এখানে আমার সম্পূর্ণ রুট বিভাগটি ..

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});

    routes.MapRoute(
        "Error - 404",
        "NotFound",
        new { controller = "Error", action = "NotFound" }
        );

    routes.MapRoute(
        "Error - 500",
        "ServerError",
        new { controller = "Error", action = "ServerError"}
        );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new {controller = "Home", action = "Index", id = UrlParameter.Optional}
        );
}

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

শেষ পর্যন্ত, আমরা আমাদের global.asaxফাইলে থাকা অবস্থায়, আমরা বিশ্বব্যাপী হ্যান্ডলিরর বৈশিষ্ট্যটি নিবন্ধন করি না। না, না, না স্যার। Nadda। নাঃ। Nien। নেতিবাচক. Noooooooooo ...

এই লাইনটি সরিয়ে দিন global.asax

GlobalFilters.Filters.Add(new HandleErrorAttribute());

পদক্ষেপ 3 - ক্রিয়া পদ্ধতিগুলির সাথে নিয়ামক তৈরি করুন

এখন .. আমরা দুটি ক্রিয়া পদ্ধতি সহ একটি নিয়ামক যুক্ত করি ...

public class ErrorController : Controller
{
    public ActionResult NotFound()
    {
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View();
    }

    public ActionResult ServerError()
    {
        Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        // Todo: Pass the exception into the view model, which you can make.
        //       That's an exercise, dear reader, for -you-.
        //       In case u want to pass it to the view, if you're admin, etc.
        // if (User.IsAdmin) // <-- I just made that up :) U get the idea...
        // {
        //     var exception = Server.GetLastError();
        //     // etc..
        // }

        return View();
    }

    // Shhh .. secret test method .. ooOOooOooOOOooohhhhhhhh
    public ActionResult ThrowError()
    {
        throw new NotImplementedException("Pew ^ Pew");
    }
}

ঠিক আছে, এটি পরীক্ষা করে দেখা যাক। প্রথমত, এখানে কোনও [HandleError] গুণাবলী নেই। কেন? কারণ বিল্ট ইনASP.NET কাঠামোটি ইতিমধ্যে ত্রুটিগুলি পরিচালনা করছে এবং আমরা ত্রুটিটি পরিচালনা করার জন্য প্রয়োজনীয় সমস্ত বিষ্ঠা নির্দিষ্ট করে দিয়েছি :) এটি এই পদ্ধতিতে!

এর পরে, আমার কাছে দুটি ক্রিয়া পদ্ধতি রয়েছে। শক্ত কিছু নেই। আপনি যদি কোনও ব্যতিক্রম তথ্য দেখাতে চান তবে আপনি Server.GetLastError()সেই তথ্যটি ব্যবহার করতে পারেন ।

বোনাস ডাব্লুটিএফ: হ্যাঁ, ত্রুটি পরিচালনা পরিচালনা করার জন্য আমি তৃতীয় ক্রিয়া পদ্ধতি তৈরি করেছি।

পদক্ষেপ 4 - দেখুন তৈরি করুন

এবং অবশেষে, দুটি মতামত তৈরি করুন। এই নিয়ামকটির জন্য এটিকে সাধারণ দর্শনীয় স্থানে রাখুন।

এখানে চিত্র বর্ণনা লিখুন

বোনাস মন্তব্য

  • আপনার দরকার নেই Application_Error(object sender, EventArgs e)
  • উপরের পদক্ষেপগুলি সমস্ত এলার্মের সাথে 100% নিখুঁতভাবে কাজ করে । এলমাকে ভ্রূজ বানানো!

এবং এটি, আমার বন্ধুরা, এটি হওয়া উচিত।

এখন, এগুলি পড়ার জন্য অভিনন্দন এবং একটি ইউনিকর্ন একটি পুরষ্কার হিসাবে রয়েছে!

এখানে চিত্র বর্ণনা লিখুন


সুতরাং আমি এটি বাস্তবায়নের চেষ্টা করেছি তবে কয়েকটি সমস্যা ... প্রথমে, আপনার একটি দরকার weebb.config এর আগে বা ভার্চুয়াল ডিরেক্টরিগুলির জন্য এটি কাজ করে না। 2-যদি আইআইএস কাস্টম ত্রুটিগুলিতে আগুন লেগে যায় এবং ভিউ কোনও লেআউট ব্যবহার করে তবে তা একেবারেই রেন্ডার করে না, কেবল একটি সাদা পৃষ্ঠা। আমি "রেসপন্স। ট্রাইস্কিপআইসক্রাস্টম এরিফ্রেসস = সত্য;" কন্ট্রোলারে এই লাইনটি যুক্ত করে সমাধান করেছি; । যাইহোক, আপনি এখনও ইউআরএল এ যান তবে এটি কাজ করে না 402 .. যেমন মাইসাইট / যাই হোক না কেন / নকল এইচটিএমএল একটি সাদা পৃষ্ঠা পায়।
রবার্ট নোক

3
-1, দুঃখিত, আমার জন্য 404 এর জন্য url পরিবর্তন করে এমন কোনও সমাধান ভুল solution এবং ওয়েবকনফিগের সাথে এমভিসিতে কোনও উপায় নেই যা আপনি এটি ইউআরএল পরিবর্তন না করেই পরিচালনা করতে পারেন, বা এটি করতে সক্ষম হওয়ার জন্য আপনার স্ট্যাটিক এইচটিএমএল ফাইল বা এসপিএক্স (হ্যাঁ, প্লেইন পুরাতন এসপেক্স ফাইল) তৈরি করতে হবে। আপনার ?aspxerrorpath=/er/not/foundইউআরএল থাকতে চাইলে আপনার সমাধানটি ঠিক আছে।
গুটেক

7
এটি সত্যিই অদ্ভুত শোনায় - তবে আমার উত্তরগুলি যুগ যুগ আগে সরবরাহ করা হয়েছিল এবং আমি আপনার @ গুটেকের সাথে একমত, আমি আর কোনও ত্রুটির পৃষ্ঠায় পুনর্নির্দেশ করা পছন্দ করি না । আমি ব্যবহার করতাম (আমার উত্তরটি প্রত্যাহার করুন: পি)। যদি কিছু / সংস্থান / ত্রুটিতে ত্রুটি দেখা দেয় .. তবে সেই সংস্থানটি 404 বা 500, ইত্যাদি ফিরিয়ে আনতে হবে অন্যথায় এসইএসের বৃহত্তর প্রভাবগুলি সংরক্ষণ করুন। আহ .. কীভাবে সময় পরিবর্তন হবে :)
খাঁটি.ক্রোম

@ গুটেক আপনি কি কাস্টমআররিসগুলি রিডাইরেক্টমোড = "রেসপন্সরাইরাইট" সম্পর্কে সচেতন? 404 এর দশকে ফিরে আসা কোনও সুরক্ষার দৃষ্টিকোণ থেকে আদর্শ নয়
জওয়েন

1
@ ক্রিস <আপনার পছন্দের দেবতা এখানে >োকান> এটি অভিশাপ। এখন কী ছিল তাও মনে করতে পারি না। ঠিক আছে, উদ্ধার করার জন্য আমার মেমের সংগ্রহ ... এবং .. স্থির।
খাঁটি.ক্রোম

86

আমি তদন্ত করে থাকেন একজন অনেক কিভাবে সঠিকভাবে MVC মধ্যে 404s পরিচালনা করবেন সে (বিশেষভাবে MVC3) , এবং এই, এই প্রোগ্রামটিতে সবচেয়ে ভালো সমাধান আমি সঙ্গে আসা পর্যন্ত করেছি:

গ্লোবাল.এক্সএক্সে:

public class MvcApplication : HttpApplication
{
    protected void Application_EndRequest()
    {
        if (Context.Response.StatusCode == 404)
        {
            Response.Clear();

            var rd = new RouteData();
            rd.DataTokens["area"] = "AreaName"; // In case controller is in another area
            rd.Values["controller"] = "Errors";
            rd.Values["action"] = "NotFound";

            IController c = new ErrorsController();
            c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
        }
    }
}

ErrorsController:

public sealed class ErrorsController : Controller
{
    public ActionResult NotFound()
    {
        ActionResult result;

        object model = Request.Url.PathAndQuery;

        if (!Request.IsAjaxRequest())
            result = View(model);
        else
            result = PartialView("_NotFound", model);

        return result;
    }
}

(ঐচ্ছিক)

ব্যাখ্যা:

আফাইক, এএসপি ডট এমভিসি 3 অ্যাপ্লিকেশন 404 এস উত্পাদন করতে পারে এমন 6 টি আলাদা কেস রয়েছে।

(স্বয়ংক্রিয়ভাবে এএসপি.নেট ফ্রেমওয়ার্ক দ্বারা উত্পাদিত :)

(1) কোনও ইউআরএল রুটের সারণীতে কোনও মিল খুঁজে পায় না।

(এএসপি.নেট এমভিসি ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে উত্পন্ন)

(2) একটি ইউআরএল রুট টেবিলের সাথে একটি মিল খুঁজে পায় তবে অস্তিত্বহীন নিয়ামক নির্দিষ্ট করে।

(3) একটি URL রুটের টেবিলের সাথে একটি মিল খুঁজে পায় তবে অ-অযৌক্তিক ক্রিয়া নির্দিষ্ট করে।

(ম্যানুয়ালি উত্পন্ন :)

(4) একটি ক্রিয়া এইচটিটিপিএনটফাউন্ড () পদ্ধতিটি ব্যবহার করে একটি এইচটিটিপিএনটফাউন্ডআরসাল্ট দেয়।

(5) একটি ক্রিয়া স্থিতি কোড 404 সহ একটি এইচটিপিএক্সসেপশন ছুড়ে দেয়।

(6) কোনও ক্রিয়া ম্যানুয়ালি রেসপন্স.স্ট্যাটাসকোড সম্পত্তিটিকে 404 এ পরিবর্তন করে।

সাধারণত, আপনি 3 টি লক্ষ্য অর্জন করতে চান:

(1) ব্যবহারকারীর কাছে একটি কাস্টম 404 ত্রুটি পৃষ্ঠা প্রদর্শন করুন।

(2) ক্লায়েন্টের প্রতিক্রিয়াতে 404 স্থিতি কোড বজায় রাখুন (এসইওয়ের জন্য বিশেষ গুরুত্বপূর্ণ)।

(3) কোনও 302 পুনঃনির্দেশ জড়িত না করে সরাসরি প্রতিক্রিয়া প্রেরণ করুন।

এটি সম্পাদন করার বিভিন্ন উপায় রয়েছে:

(1)

<system.web>
    <customErrors mode="On">
        <error statusCode="404" redirect="~/Errors/NotFound"/>
    </customError>
</system.web>

এই সমাধানে সমস্যাগুলি:

  1. (1), (4), (6) ক্ষেত্রে উদ্দেশ্য (1) মেনে চলে না।
  2. উদ্দেশ্য (2) স্বয়ংক্রিয়ভাবে অনুসরণ করে না। এটি ম্যানুয়ালি প্রোগ্রাম করা উচিত।
  3. উদ্দেশ্য (3) মেনে চলে না।

(2)

<system.webServer>
    <httpErrors errorMode="Custom">
        <remove statusCode="404"/>
        <error statusCode="404" path="App/Errors/NotFound" responseMode="ExecuteURL"/>
    </httpErrors>
</system.webServer>

এই সমাধানে সমস্যাগুলি:

  1. কেবল আইআইএস 7+ এ কাজ করে।
  2. (2), (3), (5) ক্ষেত্রে উদ্দেশ্য (1) মেনে চলে না।
  3. উদ্দেশ্য (2) স্বয়ংক্রিয়ভাবে অনুসরণ করে না। এটি ম্যানুয়ালি প্রোগ্রাম করা উচিত।

(3)

<system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
        <remove statusCode="404"/>
        <error statusCode="404" path="App/Errors/NotFound" responseMode="ExecuteURL"/>
    </httpErrors>
</system.webServer>

এই সমাধানে সমস্যাগুলি:

  1. কেবল আইআইএস 7+ এ কাজ করে।
  2. উদ্দেশ্য (2) স্বয়ংক্রিয়ভাবে অনুসরণ করে না। এটি ম্যানুয়ালি প্রোগ্রাম করা উচিত।
  3. এটি অ্যাপ্লিকেশন স্তরের HTTP ব্যতিক্রমকে অস্পষ্ট করে। উদাহরণস্বরূপ কাস্টমআরিয়ার্স বিভাগ, System.Web.Mvc.HandleErrorAttribute ইত্যাদি ব্যবহার করতে পারে না এটি কেবল জেনেরিক ত্রুটি পৃষ্ঠাগুলি প্রদর্শন করতে পারে না।

(4)

<system.web>
    <customErrors mode="On">
        <error statusCode="404" redirect="~/Errors/NotFound"/>
    </customError>
</system.web>

এবং

<system.webServer>
    <httpErrors errorMode="Custom">
        <remove statusCode="404"/>
        <error statusCode="404" path="App/Errors/NotFound" responseMode="ExecuteURL"/>
    </httpErrors>
</system.webServer>

এই সমাধানে সমস্যাগুলি:

  1. কেবল আইআইএস 7+ এ কাজ করে।
  2. উদ্দেশ্য (2) স্বয়ংক্রিয়ভাবে অনুসরণ করে না। এটি ম্যানুয়ালি প্রোগ্রাম করা উচিত।
  3. (2), (3), (5) ক্ষেত্রে উদ্দেশ্য (3) এর সাথে সম্মতি দেয় না।

যে সমস্ত ব্যক্তিরা এতে সমস্যায় পড়েছেন তারা এমনকি তাদের নিজের লাইব্রেরি তৈরি করার চেষ্টা করেছিলেন (দেখুন http://aboutcode.net/2011/02/26/handling-not-found-with-asp-net-mvc3.html )। তবে পূর্ববর্তী সমাধানটি বাহ্যিক গ্রন্থাগার ব্যবহারের জটিলতা ছাড়াই সমস্ত মামলা কভার করে বলে মনে হচ্ছে।


দুর্দান্ত উত্তর। আরও অনেক উর্ধ্বে মূল্যবান। আপনার গ্লোবাল.এক্সএক্স কোডটি অ্যাপ্লিকেশন_আরারের সাথে কাজ করে না / অন্তর্ভুক্ত করে।
নিনজায়ে

7
ধন্যবাদ! এটি অ্যাপ্লিকেশন_এররের অধীনে করা যায় না, কারণ একটি নিয়ামক থেকে স্পষ্ট 404 গুলি এএসপি.এনইটিতে ত্রুটি হিসাবে বিবেচিত হয় না। আপনি যদি কোনও নিয়ামক থেকে কোনও এইচটিপিএনটফাউন্ড () ফিরিয়ে দেন তবে অ্যাপ্লিকেশন_এরর ইভেন্টটি কখনই ট্রিগার করবে না।
মার্কো

1
আমি মনে করি আপনি public ActionResult NotFound() {}নিজের ত্রুটি নিয়ন্ত্রণকারীকে ভুলে গেছেন । এছাড়াও, আপনি কী ব্যাখ্যা করতে পারেন যে আপনার _NotFoundআংশিকটি অ্যাজেএক্স অনুরোধগুলির জন্য কেমন হবে?
d4n3

2
এমভিসি 4 দিয়ে আমি সর্বদা MissingMethodException: Cannot create an abstract classলাইনে থাকি c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); কোনও ধারণা?
ioবিও

1
যদি "খুঁজে পাওয়া যায় না" ইউআরএলটিতে পাথের মধ্যে একটি বিন্দুর (উদাহরণস্বরূপ. com/hi.bob ) অন্তর্ভুক্ত থাকে তবে অ্যাপ্লিকেশন_এন্ডআরকয়েস্টটি মোটেও আগুন দেয় না এবং আমি IE এর জেনেরিক 404 পৃষ্ঠা পাই।
Bob.at.Indigo.Health

13

আমি সত্যিই কোটসাকস সমাধানটি পছন্দ করি এবং এটির খুব স্পষ্টভাবে ব্যাখ্যা বলে মনে করি। আমার একমাত্র সংযোজনটি ছিল নিম্নরূপ পদক্ষেপ 2 পরিবর্তন করতে

public abstract class MyController : Controller
{

    #region Http404 handling

    protected override void HandleUnknownAction(string actionName)
    {
        //if controller is ErrorController dont 'nest' exceptions
        if(this.GetType() != typeof(ErrorController))
        this.InvokeHttp404(HttpContext);
    }

    public ActionResult InvokeHttp404(HttpContextBase httpContext)
    {
        IController errorController = ObjectFactory.GetInstance<ErrorController>();
        var errorRoute = new RouteData();
        errorRoute.Values.Add("controller", "Error");
        errorRoute.Values.Add("action", "Http404");
        errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString);
        errorController.Execute(new RequestContext(
             httpContext, errorRoute));

        return new EmptyResult();
    }

    #endregion
}

মূলত এটি অবৈধ ক্রিয়া এবং নিয়ামকগুলিকে যুক্ত ব্যতীত রুটিনগুলিকে দুবার ব্যতিক্রম রুটিন ট্রিগার করা বন্ধ করে দেয়। উদাহরণস্বরূপ url- এর জন্য যেমন এসএসডিএফএসডিএফ / ডিএফজিডিএফজিডি


4
এটি দুর্দান্ত। "দু'বার" মামলাগুলি আমাকে বিরক্ত করতে শুরু করেছিল। আমার উত্তর আপডেট করেছে
ম্যাট কোকাজ

ব্যবহারকারী ভুল নিয়ামক এবং ক্রিয়া নাম লিখলে উপরের সমাধানটি কি আদৌ কার্যকর হয়?
মনোজিৎ সরকার 6'18

6

আমি অবৈধ নিয়ন্ত্রণকারীদের জন্য কাজ করার জন্য @ কোটসাকের পদ্ধতিটি পাবার একমাত্র উপায় হ'ল কাস্টমকন্ট্রোলারফ্যাক্টরিতে বিদ্যমান রুটের অনুরোধটি সংশোধন করা, যেমন:

public class CustomControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        try
        {
            if (controllerType == null)
                return base.GetControllerInstance(requestContext, controllerType); 
            else
                return ObjectFactory.GetInstance(controllerType) as Controller;
        }
        catch (HttpException ex)
        {
            if (ex.GetHttpCode() == (int)HttpStatusCode.NotFound)
            {
                requestContext.RouteData.Values["controller"] = "Error";
                requestContext.RouteData.Values["action"] = "Http404";
                requestContext.RouteData.Values.Add("url", requestContext.HttpContext.Request.Url.OriginalString);

                return ObjectFactory.GetInstance<ErrorController>();
            }
            else
                throw ex;
        }
    }
}

আমার উল্লেখ করা উচিত আমি এমভিসি 2.0 ব্যবহার করছি।


তুমি কি জানো কেন? (এমভিসি 2 নির্দিষ্ট?)
ম্যাট কোকাজ

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

আমি আমার উত্তরটি আজ কিছু এমভিসি 2 নির্দিষ্টকরণের সাথে আপডেট করেছি। আপনি কি দয়া করে আমাকে বলতে পারেন যে উপরে বর্ণিত আমার সমাধান এখনও আপনার পক্ষে কাজ করে না?
ম্যাট কোকাজ

4

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

এর মধ্যে কয়েকটি উপরের কোটসাকের কৌশলতে নতুন নেওয়া।

এই সমাধানটি এমভিসি 3 ত্রুটি ফিল্টারগুলির পরিবর্তে ন্যূনতম ওয়েবকনফিগ সেটিংসও ব্যবহার করে।

ব্যবহার

কোনও ক্রিয়া বা কাস্টম অ্যাকশনফিলারঅ্যাট্রিবিউট থেকে কেবল একটি HTTPException নিক্ষেপ করুন।

Throw New HttpException(HttpStatusCode.NotFound, "[Custom Exception Message Here]")

ধাপ 1

আপনার ওয়েবকনফিগটিতে নিম্নলিখিত সেটিংস যুক্ত করুন। এটি এমভিসির হ্যান্ডেলআররঅ্যাট্রিবিউট ব্যবহার করা প্রয়োজন।

<customErrors mode="On" redirectMode="ResponseRedirect" />

ধাপ ২

এইচটিটিপি ত্রুটি ব্যতীত এমভিসি ফ্রেমওয়ার্কের হ্যান্ডলআররঅ্যাট্রিবিউটের অনুরূপ একটি কাস্টম হ্যান্ডেলহ্যাট্পএররআর্ট্রিবিউট যুক্ত করুন:

<AttributeUsage(AttributeTargets.All, AllowMultiple:=True)>
Public Class HandleHttpErrorAttribute
    Inherits FilterAttribute
    Implements IExceptionFilter

    Private Const m_DefaultViewFormat As String = "ErrorHttp{0}"

    Private m_HttpCode As HttpStatusCode
    Private m_Master As String
    Private m_View As String

    Public Property HttpCode As HttpStatusCode
        Get
            If m_HttpCode = 0 Then
                Return HttpStatusCode.NotFound
            End If
            Return m_HttpCode
        End Get
        Set(value As HttpStatusCode)
            m_HttpCode = value
        End Set
    End Property

    Public Property Master As String
        Get
            Return If(m_Master, String.Empty)
        End Get
        Set(value As String)
            m_Master = value
        End Set
    End Property

    Public Property View As String
        Get
            If String.IsNullOrEmpty(m_View) Then
                Return String.Format(m_DefaultViewFormat, Me.HttpCode)
            End If
            Return m_View
        End Get
        Set(value As String)
            m_View = value
        End Set
    End Property

    Public Sub OnException(filterContext As System.Web.Mvc.ExceptionContext) Implements System.Web.Mvc.IExceptionFilter.OnException
        If filterContext Is Nothing Then Throw New ArgumentException("filterContext")

        If filterContext.IsChildAction Then
            Return
        End If

        If filterContext.ExceptionHandled OrElse Not filterContext.HttpContext.IsCustomErrorEnabled Then
            Return
        End If

        Dim ex As HttpException = TryCast(filterContext.Exception, HttpException)
        If ex Is Nothing OrElse ex.GetHttpCode = HttpStatusCode.InternalServerError Then
            Return
        End If

        If ex.GetHttpCode <> Me.HttpCode Then
            Return
        End If

        Dim controllerName As String = filterContext.RouteData.Values("controller")
        Dim actionName As String = filterContext.RouteData.Values("action")
        Dim model As New HandleErrorInfo(filterContext.Exception, controllerName, actionName)

        filterContext.Result = New ViewResult With {
            .ViewName = Me.View,
            .MasterName = Me.Master,
            .ViewData = New ViewDataDictionary(Of HandleErrorInfo)(model),
            .TempData = filterContext.Controller.TempData
        }
        filterContext.ExceptionHandled = True
        filterContext.HttpContext.Response.Clear()
        filterContext.HttpContext.Response.StatusCode = Me.HttpCode
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = True
    End Sub
End Class

ধাপ 3

GlobalFilterCollection (ফিল্টার যোগ করুন GlobalFilters.Filters) এ Global.asax। এই উদাহরণটি সমস্ত অভ্যন্তরীণ সার্ভারেরর (500) ত্রুটিটিকে ত্রুটিযুক্ত ভাগ করা দর্শন ( Views/Shared/Error.vbhtml) এ রুট করবে । নটফাউন্ড (404) ত্রুটিগুলি ভাগ করা ভিউগুলিতেও ত্রুটিহট্ট 4040.vbhtml এ প্রেরণ করা হবে। অতিরিক্ত HTTP ত্রুটি কোডগুলির জন্য এটি কীভাবে বাড়ানো যেতে পারে তা দেখানোর জন্য আমি এখানে একটি 401 ত্রুটি যুক্ত করেছি। নোট করুন যে এগুলি অবশ্যই ভাগ করা দর্শন থাকতে হবে এবং তারা সকলেই System.Web.Mvc.HandleErrorInfoমডেল হিসাবে এই বস্তুটি ব্যবহার করে ।

filters.Add(New HandleHttpErrorAttribute With {.View = "ErrorHttp401", .HttpCode = HttpStatusCode.Unauthorized})
filters.Add(New HandleHttpErrorAttribute With {.View = "ErrorHttp404", .HttpCode = HttpStatusCode.NotFound})
filters.Add(New HandleErrorAttribute With {.View = "Error"})

পদক্ষেপ 4

একটি বেস নিয়ামক শ্রেণি তৈরি করুন এবং এটি আপনার নিয়ামকদের মধ্যে উত্তরাধিকারী। এই পদক্ষেপটি আমাদের অজানা ক্রিয়াকলাপের নামগুলি পরিচালনা করতে এবং HTTP 404 ত্রুটিটি আমাদের হ্যান্ডেল HTTPErrorAttribute এ বাড়ানোর অনুমতি দেয়।

Public Class BaseController
    Inherits System.Web.Mvc.Controller

    Protected Overrides Sub HandleUnknownAction(actionName As String)
        Me.ActionInvoker.InvokeAction(Me.ControllerContext, "Unknown")
    End Sub

    Public Function Unknown() As ActionResult
        Throw New HttpException(HttpStatusCode.NotFound, "The specified controller or action does not exist.")
        Return New EmptyResult
    End Function
End Class

পদক্ষেপ 5

একটি কন্ট্রোলফ্যাক্টরির ওভাররাইড তৈরি করুন এবং এটিকে অ্যাপ্লিকেশন_স্টার্টে আপনার Global.asax ফাইলে ওভাররাইড করুন। যখন কোনও অবৈধ নিয়ামকের নাম নির্দিষ্ট করা হয়েছে তখন এই পদক্ষেপটি আমাদের HTTP 404 ব্যতিক্রম বাড়াতে দেয়।

Public Class MyControllerFactory
    Inherits DefaultControllerFactory

    Protected Overrides Function GetControllerInstance(requestContext As System.Web.Routing.RequestContext, controllerType As System.Type) As System.Web.Mvc.IController
        Try
            Return MyBase.GetControllerInstance(requestContext, controllerType)
        Catch ex As HttpException
            Return DependencyResolver.Current.GetService(Of BaseController)()
        End Try
    End Function
End Class

'In Global.asax.vb Application_Start:

controllerBuilder.Current.SetControllerFactory(New MyControllerFactory)

পদক্ষেপ 6

আপনার রাউটবেলগুলিতে একটি বিশেষ রুট অন্তর্ভুক্ত করুন Base বেসকন্ট্রোলার অজানা ক্রিয়াটির জন্য পদক্ষেপ ou এটি আমাদের ক্ষেত্রে 404 বাড়াতে সহায়তা করবে যেখানে কোনও ব্যবহারকারী কোনও অজানা নিয়ামক বা অজানা ক্রিয়াকলাপটি অ্যাক্সেস করে।

'BaseController
routes.MapRoute( _
    "Unknown", "BaseController/{action}/{id}", _
    New With {.controller = "BaseController", .action = "Unknown", .id = UrlParameter.Optional} _
)

সারসংক্ষেপ

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

আমি যদি একটি পোস্ট পোস্ট করার জন্য পর্যাপ্ত ভোট পাই তবে আমি হোম / ট্রিগার নটফাউন্ড ক্রিয়াকলাপ থেকে অবৈধ নিয়ামক নাম, ক্রিয়া নাম এবং একটি কাস্টম 404 উত্থাপিত স্ক্রিনশট যুক্ত করব) আমি যখন এই সমাধানটি ব্যবহার করে নিম্নলিখিত URL গুলিতে অ্যাক্সেস করি তখন ফিডলার 404 বার্তা ফেরত:

/InvalidController
/Home/InvalidRoute
/InvalidController/InvalidRoute
/Home/TriggerNotFound

উপরের কোটসকের পোস্ট এবং এই নিবন্ধগুলি ভাল রেফারেন্স ছিল।


হুম, আমি এটি কাজ করতে পারি না: The IControllerFactory 'aaa.bbb.CustomControllerFactory' did not return a controller for the name '123'.- কোনও ধারণা কেন আমি তা পাব?
এনাশনাশ

redirectMode = "ResponseRedirect"। এটি 302 পাওয়া + একটি 200 ঠিক আছে যা এসইওর পক্ষে ভাল নয়!
পুসইনবুটস 18:34

4

আমার সংক্ষিপ্ত সমাধান যা আনহ্যান্ডেল অঞ্চলগুলি, নিয়ন্ত্রণকারী এবং ক্রিয়াগুলির সাথে কাজ করে:

  1. 404.cshtml দেখুন।

  2. আপনার নিয়ন্ত্রকদের জন্য একটি বেস শ্রেণি তৈরি করুন:

    public class Controller : System.Web.Mvc.Controller
    {
        protected override void HandleUnknownAction(string actionName)
        {
            Http404().ExecuteResult(ControllerContext);
        }
    
        protected virtual ViewResult Http404()
        {
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            return View("404");
        }
    }
  3. ফালব্যাক হিসাবে আপনার বেস নিয়ামককে ফেরত একটি কাস্টম নিয়ামক কারখানা তৈরি করুন:

    public class ControllerFactory : DefaultControllerFactory
    {
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType != null)
                return base.GetControllerInstance(requestContext, controllerType);
    
            return new Controller();
        }
    }
  4. যোগ Application_Start()নিম্নলিখিত লাইন:

    ControllerBuilder.Current.SetControllerFactory(typeof(ControllerFactory));

3

এমভিসি 4 তে ওয়েবএপিআই 404 নিম্নলিখিত পদ্ধতিতে পরিচালনা করতে পারে,

কোর্স এপিকন্ট্রোলার

    // GET /api/courses/5
    public HttpResponseMessage<Courses> Get(int id)
    {
        HttpResponseMessage<Courses> resp = null;

        var aCourse = _courses.Where(c => c.Id == id).FirstOrDefault();

        resp = aCourse == null ? new HttpResponseMessage<Courses>(System.Net.HttpStatusCode.NotFound) : new HttpResponseMessage<Courses>(aCourse);

        return resp;
    }

হোম কন্ট্রোলার

public ActionResult Course(int id)
{
    return View(id);
}

দেখুন

<div id="course"></div>
<script type="text/javascript">
    var id = @Model;
    var course = $('#course');
    $.ajax({    
        url: '/api/courses/' + id,
        success: function (data) {
            course.text(data.Name);
        },
        statusCode: {
            404: function() 
            {
                course.text('Course not available!');    
            }
        }
    });
</script>

গ্লোবাল

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

ফলাফল

এখানে চিত্র বর্ণনা লিখুন


2

নুগেটে নটফাউন্ড এমভিসি চেষ্টা করুন। এটি কাজ করে, কোনও সেটআপ নেই।


http://localhost/Views/Shared/NotFound.cshtmlএকটি কাস্টম 404 পৃষ্ঠাতে ফলাফল হয় না।
ড্যান ফ্রিডম্যান

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

এটি দুর্দান্ত প্যাকেজ, আপনি অ্যাসিঙ্ক টাস্ক <অ্যাকশনআরসাল্ট> ক্রিয়াকলাপ (বা অন্যান্য অনুরূপ অ্যাসিঙ্ক) ক্রিয়া ব্যবহার করবেন না এমনটি প্রদান করে। এমভিসি 5 এ এটি একটি ভাঙ্গা দৃশ্য। গিটারহাবের উপর একটি কাঁটাচামচ রয়েছে যা এড়িয়ে যাওয়ার জন্য, তবে আমার কাছে এটি একটি না, না।
স্টারগাজার

2

আমার সমাধান, যদি কেউ এটির কাজে লাগে।

ওয়েবকনফিগে:

<system.web>
    <customErrors mode="On" defaultRedirect="Error" >
      <error statusCode="404" redirect="~/Error/PageNotFound"/>
    </customErrors>
    ...
</system.web>

ইন Controllers/ErrorController.cs:

public class ErrorController : Controller
{
    public ActionResult PageNotFound()
    {
        if(Request.IsAjaxRequest()) {
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            return Content("Not Found", "text/plain");
        }

        return View();
    }
}

একটি যোগ করুন PageNotFound.cshtmlমধ্যে Sharedফোল্ডার এবং যে এটি।


2
এই ইস্যুটি কি ক্লায়েন্টের কাছে 200 (ওকে) স্থিতির পরে 302 পুনর্নির্দেশ করে না? তাদের এখনও 404 স্ট্যাটাস পাওয়া উচিত নয়?
স্যাম

@ কেনামিমন আপনি কি নিশ্চিত যে আপনার কোডের লাইনটি পড়তে হবে model.RequestedUrl = Request.Url.OriginalString.Contains(url) & Request.Url.OriginalString != url ? Request.Url.OriginalString : url;এবং না model.RequestedUrl = Request.Url.OriginalString.Contains(url) && Request.Url.OriginalString != url ? Request.Url.OriginalString : url;(এবং && এর পরিবর্তে)?
জিন-ফ্রান্সোইস বিউচ্যাম্প

2

আমার কাছে মনে হয় যে স্ট্যান্ডার্ড CustomErrorsকনফিগারেশনটি কেবলমাত্র কাজ করা উচিত , এর উপর নির্ভরতার কারণে Server.Transferমনে হয় এর অভ্যন্তরীণ বাস্তবায়নResponseRewrite এমভিসির সাথে সামঞ্জস্যপূর্ণ নয়।

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

<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite">
    <error statusCode="404" redirect="404.aspx" />
    <error statusCode="500" redirect="~/MVCErrorPage" />
</customErrors>

এটি নিম্নলিখিত প্ল্যাটফর্মগুলিতে পরীক্ষা করা হয়েছে;

  • ইন্টিগ্রেটেড পাইপলাইন মোডে এমভিসি 4 (আইআইএস এক্সপ্রেস 8)
  • ক্লাসিক মোডে এমভিসি 4 (ভিএস ডেভলপমেন্ট সার্ভার, ক্যাসিনি)
  • ক্লাসিক মোডে এমভিসি 4 (আইআইএস 6)

উপকারিতা

  • জেনেরিক সমাধান যা কোনও এমভিসি প্রকল্পে ফেলে দেওয়া যেতে পারে
  • প্রথাগত কাস্টম ত্রুটি কনফিগারেশনের জন্য সমর্থন সক্ষম করে
  • উভয় সমন্বিত পাইপলাইন এবং ক্লাসিক মোডে কাজ করে

সমাধান

namespace Foo.Bar.Modules {

    /// <summary>
    /// Enables support for CustomErrors ResponseRewrite mode in MVC.
    /// </summary>
    public class ErrorHandler : IHttpModule {

        private HttpContext HttpContext { get { return HttpContext.Current; } }
        private CustomErrorsSection CustomErrors { get; set; }

        public void Init(HttpApplication application) {
            System.Configuration.Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~");
            CustomErrors = (CustomErrorsSection)configuration.GetSection("system.web/customErrors");

            application.EndRequest += Application_EndRequest;
        }

        protected void Application_EndRequest(object sender, EventArgs e) {

            // only handle rewrite mode, ignore redirect configuration (if it ain't broke don't re-implement it)
            if (CustomErrors.RedirectMode == CustomErrorsRedirectMode.ResponseRewrite && HttpContext.IsCustomErrorEnabled) {

                int statusCode = HttpContext.Response.StatusCode;

                // if this request has thrown an exception then find the real status code
                Exception exception = HttpContext.Error;
                if (exception != null) {
                    // set default error status code for application exceptions
                    statusCode = (int)HttpStatusCode.InternalServerError;
                }

                HttpException httpException = exception as HttpException;
                if (httpException != null) {
                    statusCode = httpException.GetHttpCode();
                }

                if ((HttpStatusCode)statusCode != HttpStatusCode.OK) {

                    Dictionary<int, string> errorPaths = new Dictionary<int, string>();

                    foreach (CustomError error in CustomErrors.Errors) {
                        errorPaths.Add(error.StatusCode, error.Redirect);
                    }

                    // find a custom error path for this status code
                    if (errorPaths.Keys.Contains(statusCode)) {
                        string url = errorPaths[statusCode];

                        // avoid circular redirects
                        if (!HttpContext.Request.Url.AbsolutePath.Equals(VirtualPathUtility.ToAbsolute(url))) {

                            HttpContext.Response.Clear();
                            HttpContext.Response.TrySkipIisCustomErrors = true;

                            HttpContext.Server.ClearError();

                            // do the redirect here
                            if (HttpRuntime.UsingIntegratedPipeline) {
                                HttpContext.Server.TransferRequest(url, true);
                            }
                            else {
                                HttpContext.RewritePath(url, false);

                                IHttpHandler httpHandler = new MvcHttpHandler();
                                httpHandler.ProcessRequest(HttpContext);
                            }

                            // return the original status code to the client
                            // (this won't work in integrated pipleline mode)
                            HttpContext.Response.StatusCode = statusCode;

                        }
                    }

                }

            }

        }

        public void Dispose() {

        }


    }

}

ব্যবহার

এটি আপনার ওয়েবকনফাইগে চূড়ান্ত এইচটিটিপি মডিউল হিসাবে অন্তর্ভুক্ত করুন

  <system.web>
    <httpModules>
      <add name="ErrorHandler" type="Foo.Bar.Modules.ErrorHandler" />
    </httpModules>
  </system.web>

  <!-- IIS7+ -->
  <system.webServer>
    <modules>
      <add name="ErrorHandler" type="Foo.Bar.Modules.ErrorHandler" />
    </modules>
  </system.webServer>

আপনারা যারা মনোযোগ দিচ্ছেন তাদের জন্য আপনি লক্ষ্য করবেন যে ইন্টিগ্রেটেড পাইপলাইন মোডে এটি Server.TransferRequestকাজ করার কারণে এইচটিটিপি 200 এর সাথে সর্বদা প্রতিক্রিয়া জানাবে । যথাযথ ত্রুটি কোডটি ফিরে পেতে আমি নিম্নলিখিত ত্রুটি নিয়ামকটি ব্যবহার করি।

public class ErrorController : Controller {

    public ErrorController() { }

    public ActionResult Index(int id) {
        // pass real error code to client
        HttpContext.Response.StatusCode = id;
        HttpContext.Response.TrySkipIisCustomErrors = true;

        return View("Errors/" + id.ToString());
    }

}

2

এএসপি.নেট এমভিসিতে ত্রুটিগুলি মোকাবেলা করা বাটটিতে কেবল একটি ব্যথা। আমি এই পৃষ্ঠায় এবং অন্যান্য প্রশ্ন এবং সাইটগুলিতে সম্পূর্ণ পরামর্শ দেওয়ার চেষ্টা করেছি এবং কিছুই ভাল কাজ করে না। এক পরামর্শের উপর ত্রুটি হ্যান্ডেল করতে ছিল web.config ভিতরে system.webserver কিন্তু যে শুধু আয় ফাঁকা পৃষ্ঠা

এই সমাধানটি নিয়ে আসার সময় আমার লক্ষ্য ছিল;

  • পুনর্নির্মাণ নয়
  • ডিফল্ট ত্রুটি হ্যান্ডলিংয়ের মতো প্রোপার স্ট্যাটাস কোডগুলি 200 / ওকে নয় Return

এখানে আমার সমাধান।

1। System.web বিভাগে নিম্নলিখিতটি যুক্ত করুন

   <system.web>
     <customErrors mode="On" redirectMode="ResponseRewrite">
      <error statusCode="404"  redirect="~/Error/404.aspx" />
      <error statusCode="500" redirect="~/Error/500.aspx" />
     </customErrors>
    <system.web>

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

। আপনার প্রকল্পের মূলটিতে ত্রুটি (বা আপনি যা পছন্দ করুন) নামে একটি ফোল্ডার তৈরি করুন এবং দুটি ওয়েবফরম যুক্ত করুন। নীচে আমার 404 পৃষ্ঠা;

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="404.aspx.cs" Inherits="Myapp.Error._404" %>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title >Page Not found</title>
    <link href="<%=ResolveUrl("~/Content/myapp.css")%>" rel="stylesheet" />
</head>
<body>
    <div class="top-nav">
      <a runat="server" class="company-logo" href="~/"></a>
    </div>
    <div>
        <h1>404 - Page Not found</h1>
        <p>The page you are looking for cannot be found.</p>
        <hr />
        <footer></footer>
    </div>
</body>
</html>

এবং পিছনে কোড আমি প্রতিক্রিয়া কোড সেট

protected void Page_Load(object sender, EventArgs e)
{
    Response.StatusCode = 404;
}

500 পৃষ্ঠার জন্য একই করুন

3। নিয়ন্ত্রণকারীদের মধ্যে ত্রুটিগুলি পরিচালনা করতে। এটি করার অনেক উপায় আছে। এটিই আমার পক্ষে কাজ করেছিল। আমার সমস্ত কন্ট্রোলারগণ বেস নিয়ন্ত্রকের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। বেস নিয়ামকটিতে আমার নিম্নলিখিত পদ্ধতি রয়েছে have

protected ActionResult ShowNotFound()
{
    return ShowNotFound("Page not found....");
}

protected ActionResult ShowNotFound(string message)
{
    return ShowCustomError(HttpStatusCode.NotFound, message);
}

protected ActionResult ShowServerError()
{
    return ShowServerError("Application error....");
}

protected ActionResult ShowServerError(string message)
{
    return ShowCustomError(HttpStatusCode.InternalServerError, message);
}

protected ActionResult ShowNotAuthorized()
{
    return ShowNotAuthorized("You are not allowed ....");

}

protected ActionResult ShowNotAuthorized(string message)
{
    return ShowCustomError(HttpStatusCode.Forbidden, message);
}

protected ActionResult ShowCustomError(HttpStatusCode statusCode, string message)
{
    Response.StatusCode = (int)statusCode;
    string title = "";
    switch (statusCode)
    {
        case HttpStatusCode.NotFound:
            title = "404 - Not found";
            break;
        case HttpStatusCode.Forbidden:
            title = "403 - Access Denied";
            break;
        default:
            title = "500 - Application Error";
            break;
    }
    ViewBag.Title = title;
    ViewBag.Message = message;
    return View("CustomError");
}

4। আপনার ভাগ করা ভিউ ফোল্ডারে কাস্টমআরআর.আর । নীচে আমার;

<h1>@ViewBag.Title</h1>
<br />
<p>@ViewBag.Message</p>

এখন আপনার অ্যাপ্লিকেশন নিয়ামক আপনি এই জাতীয় কিছু করতে পারেন;

public class WidgetsController : ControllerBase
{
  [HttpGet]
  public ActionResult Edit(int id)
  {
    Try
    {
       var widget = db.getWidgetById(id);
       if(widget == null)
          return ShowNotFound();
          //or return ShowNotFound("Invalid widget!");
       return View(widget);
    }
    catch(Exception ex)
    {
       //log error
       logger.Error(ex)
       return ShowServerError();
    }
  }
}

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


1

আমার মন্তব্যটি অনেক দীর্ঘ হওয়ায় একটি উত্তর পোস্ট করা হচ্ছে ...

এটি ইউনিকর্ন পোস্ট / উত্তর সম্পর্কে একটি মন্তব্য এবং প্রশ্ন উভয়ই:

https://stackoverflow.com/a/7499406/687549

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

@ Pure.Krome

  1. জিডব্লিউবি দ্বারা নির্দেশিত মন্তব্যগুলি থেকে আপনি কি এসইও স্টাফ দিয়ে আপনার উত্তর আপডেট করতে পারেন (আপনার উত্তরে এর আগে কখনও উল্লেখ করা হয়নি) - <customErrors mode="On" redirectMode="ResponseRewrite">এবং <httpErrors errorMode="Custom" existingResponse="Replace">?

  2. আপনি যদি আপনার এএসপি.এনইটি টিম বন্ধুবান্ধবকে জিজ্ঞাসা করতে পারেন যে এটি এটি করা ঠিক আছে - তবে তা নিশ্চিত হয়ে ভাল লাগবে - সম্ভবত এটি পরিবর্তন করার পক্ষে বড় কারণ নেই redirectModeএবং existingResponseএসইওর সাথে সুন্দরভাবে খেলতে সক্ষম হবেন ?!

  3. আপনি কিছু যে সব উপাদান পার্শ্ববর্তী শোধন জুড়তে পারেন ( customErrors redirectMode="ResponseRewrite", customErrors redirectMode="ResponseRedirect", httpErrors errorMode="Custom" existingResponse="Replace", অপসারণ customErrorsসম্পূর্ণরূপে যেমন কেউ প্রস্তাব) মাইক্রোসফট এ আপনার বন্ধুদের সাথে কথা বলার পরে?

আমি বলার অপেক্ষা রাখে না ছিল; যদি আমরা আপনার উত্তরটিকে আরও সম্পূর্ণ তৈরি করতে পারি তবে এটি চমত্কার হবে। 54,000+ দর্শন সহ এটি মোটামুটি জনপ্রিয় প্রশ্ন।

আপডেট : ইউনিকর্ন উত্তর একটি 302 পাওয়া যায় এবং 200 টি ওকে করে এবং কেবল একটি রুট ব্যবহার করে 404 ফেরত পাঠানো যায় না। এটি একটি দৈহিক ফাইল হতে হবে যা খুব এমভিসি নয়: ইশ। সুতরাং অন্য একটি সমাধানের দিকে অগ্রসর। খুব খারাপ কারণ এটি চূড়ান্ত এমভিসি বলে মনে হয়েছিল: এটি এখন পর্যন্ত উত্তর।


1

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

একটি কাস্টম ত্রুটি নিয়ন্ত্রণকারী তৈরি করুন:

public class Error404Controller : BaseController
{
    [HttpGet]
    public ActionResult PageNotFound()
    {
        Response.StatusCode = 404;
        return View("404");
    }
}

তারপরে একটি কাস্টম নিয়ামক কারখানা তৈরি করুন:

public class CustomControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return controllerType == null ? new Error404Controller() : base.GetControllerInstance(requestContext, controllerType);
    }
}

অবশেষে, কাস্টম ত্রুটি নিয়ন্ত্রণকারীটিতে একটি ওভাররাইড যুক্ত করুন:

protected override void HandleUnknownAction(string actionName)
{
    var errorRoute = new RouteData();
    errorRoute.Values.Add("controller", "Error404");
    errorRoute.Values.Add("action", "PageNotFound");
    new Error404Controller().Execute(new RequestContext(HttpContext, errorRoute));
}

এবং এটাই. Web.config পরিবর্তনের দরকার নেই।


1

1) বিমূর্ত কন্ট্রোলার ক্লাস করুন।

public abstract class MyController:Controller
{
    public ActionResult NotFound()
    {
        Response.StatusCode = 404;
        return View("NotFound");
    }

    protected override void HandleUnknownAction(string actionName)
    {
        this.ActionInvoker.InvokeAction(this.ControllerContext, "NotFound");
    }
    protected override void OnAuthorization(AuthorizationContext filterContext) { }
}  

2) আপনার সমস্ত নিয়ামকগুলিতে এই বিমূর্ত শ্রেণি থেকে উত্তরাধিকার করুন

public class HomeController : MyController
{}  

3) এবং আপনার ভিউ-শেয়ার্ড ফোল্ডারে "নটফাউন্ড" নামে একটি ভিউ যুক্ত করুন।


0

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

যেহেতু @ মারকো 404 ঘটতে পারে তার বিভিন্ন ক্ষেত্রে উল্লেখ করেছেন, আমি সেই তালিকার বিপরীতে একসাথে সংকলিত সমাধানটি পরীক্ষা করেছিলাম। তার প্রয়োজনীয়তার তালিকার পাশাপাশি, আমি আরও একটি যুক্ত করেছি added

  • সমাধানটি এমভিসি হ্যান্ডল করার পাশাপাশি এজেএক্স / ওয়েবএপিআই কলগুলি সবচেয়ে উপযুক্ত উপায়ে পরিচালনা করতে সক্ষম হওয়া উচিত। (যেমন যদি এমভিসিতে 404 ঘটে থাকে তবে এটি নট ফাইন্ড পৃষ্ঠাটি প্রদর্শন করা উচিত এবং যদি 404 ওয়েবএপিআইতে ঘটে থাকে তবে এটি এক্সএমএল / জেএসওএন প্রতিক্রিয়াটিকে হাইজ্যাক করা উচিত নয় যাতে গ্রাসকারী জাভাস্ক্রিপ্ট সহজেই পার্স করতে পারে)।

এই দ্রবণটি 2 গুণ:

এর প্রথম অংশটি https://stackoverflow.com/a/27354140/2310818 এ @ গুইলিউম থেকে আসে । তাদের সমাধান যে কোনও 404 কে অবৈধ রুট, অবৈধ নিয়ামক এবং অবৈধ ক্রিয়াকলাপের কারণে ঘটেছে care

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


এর দ্বিতীয় অংশটি https://stackoverflow.com/a/5536676/2310818 এ @ জার্মানি থেকে এসেছে । তাদের সমাধানটি HTTPNotFoundResult () আকারে আপনার ক্রিয়াকলাপে যে কোনও 404 ফিরে এসেছে বা নতুন এইচটিপিএক্সসেপশন () নিক্ষেপ করবে!

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


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


0

আমি সমস্ত নিবন্ধের মধ্যে দিয়েছি তবে কিছুই আমার পক্ষে কার্যকর হয় না: আমার প্রয়োজনীয় ব্যবহারকারী আপনার ইউআরএল কাস্টম 404 পৃষ্ঠাতে যে কোনও কিছু টাইপ করুন should

 <system.web>
    <customErrors mode="On" redirectMode="ResponseRewrite">
      <error statusCode="404" redirect="~/PageNotFound.aspx"/>
    </customErrors>
  </system.web>
<system.webServer>
    <httpErrors errorMode="Custom">
      <remove statusCode="404"/>
      <error statusCode="404" path="/PageNotFound.html" responseMode="ExecuteURL"/>
    </httpErrors>
</system.webServer>

আমি এই নিবন্ধটি খুব সাহায্যকারী পেয়েছি। একবারে পড়া উচিত। গ্রাহক ত্রুটি পৃষ্ঠা-বেন ফস্টার

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