কাস্টম এএসপি.নেট এমভিসি 404 ত্রুটি পৃষ্ঠাটির জন্য রাউটিং


116

আমি যখন কাস্টম HTTP 404 ত্রুটি পৃষ্ঠাটি তৈরি করার চেষ্টা করছি তখন যখন কেউ এমন কোনও URL টাইপ করে যা ASP.NET MVC- এ কোনও বৈধ ক্রিয়া বা নিয়ামককে আবেদন করে না, পরিবর্তে জেনেরিক "রিসোর্স পাওয়া যায় না" এএসপি.নেট ত্রুটি প্রদর্শন করে।

আমি এটি হ্যান্ডেল করার জন্য ওয়েবকনফিগটি ব্যবহার করতে চাই না।

কোনও অবৈধ ইউআরএল ধরতে আমি কি কোনও ধরণের রাউটিং যাদু করতে পারি?

আপডেট: আমি দেওয়া উত্তরটি চেষ্টা করেছিলাম, তবে আমি এখনও কুৎসিত "রিসোর্স পাওয়া যায় না" বার্তাটি পেয়েছি।

আরেকটি আপডেট: ঠিক আছে, দৃশ্যত আরসি 1-তে কিছু পরিবর্তন হয়েছে। এমনকি আমি একটিতে 404 আটকে দেওয়ার চেষ্টা করেছি HttpExceptionএবং এটি এখনও আমাকে "রিসোর্স পাওয়া যায় না" পৃষ্ঠাটি দেয়।

এমনকি আমি এমভিসিকন্ট্রিবের রিসোর্সের বৈশিষ্ট্য এবং কিছুই ব্যবহার করেছি না - একই সমস্যা। কোন ধারনা?



@ পিটার এটিই একটি সমাধান যা আমি যুক্ত করেছি যে হ্যান্ডল ইউএনঅ্যাকশনকে ওভাররাইড করার সাথে সাথে কোনও পৃষ্ঠার সন্ধান পাওয়া যায় না যখন কোনও অ্যাকশন উপস্থিত না থাকে এবং তারপরে ব্যবহারকারীরা টাইপ করতে পারে এমন উইকিপি হ্যান্ডলারের জন্য এএসপি.net কাস্টম ত্রুটি হ্যান্ডলারটি অন্তর্নির্মিত the ।
dswatik

এই কাজ @pete পাশাপাশি stackoverflow.com/questions/619895/...
dswatik

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

উত্তর:


10

রুট টেবিলের শেষে সমস্ত রুটকে কেবল যুক্ত করুন এবং এটির সাথে যে পৃষ্ঠাটি চান তা প্রদর্শন করুন।

দেখুন: আমি কীভাবে এএসপি.নেট এমভিসি'র 403 পৃষ্ঠাগুলি খুঁজে পাওয়া যায় না?


তবে আমি এটি চেষ্টা করেছিলাম, আমি এখনও কুৎসিত
এএসপি.নেট

3
আমি এই উত্তরটির জন্য বা সরবরাহিত লিঙ্কটিতে এই সমস্যার সুনির্দিষ্ট (এবং নমনীয় !!) সমাধান খুঁজে পাচ্ছি না।
পিটার

4
আমিও না ... এটি হ্যাকি উত্তর মত মনে হচ্ছে। আমি ওয়েস্টফোমে যেমন কাস্টমএরআরসের আচরণ করে সেভাবে করার জন্য আরও একটি উপায় খুঁজছি। কোন ধারনা?
জে.সি. গ্রুবস 0

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

105

আমি 3 ঘন্টা প্রোডাকশন সার্ভারে কাস্টম ত্রুটিগুলি সক্ষম করার চেষ্টা করেছি, দেখে মনে হচ্ছে কোনও উপায় ছাড়াই এটিএসপি নেট নেট এমভিসিতে এটি কীভাবে করা যায় final

এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটিতে কাস্টম ত্রুটিগুলি সক্ষম করতে আমাদের প্রয়োজন (আইআইএস 7+):

  1. system.webবিভাগের অধীনে ওয়েব কনফিগারেশনে কাস্টম পৃষ্ঠাগুলি কনফিগার করুন :

    <customErrors mode="RemoteOnly"  defaultRedirect="~/error">
        <error statusCode="404" redirect="~/error/Error404" />
        <error statusCode="500" redirect="~/error" />
    </customErrors>

    RemoteOnlyএর অর্থ স্থানীয় নেটওয়ার্কে আপনি আসল ত্রুটিগুলি দেখতে পাবেন (বিকাশের সময় খুব কার্যকর)। আমরা কোনও ত্রুটি কোডের জন্য ত্রুটি পৃষ্ঠা পুনরায় লিখতে পারি।

  2. ম্যাজিক রেসপন্স প্যারামিটার এবং প্রতিক্রিয়া স্থিতি কোড সেট করুন (ত্রুটি হ্যান্ডলিং মডিউলে বা ত্রুটি হ্যান্ডেল বৈশিষ্ট্যে)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
  3. system.webServerবিভাগের অধীনে ওয়েব কনফিগারেশনে অন্য যাদু সেটিং সেট করুন :

    <httpErrors errorMode="Detailed" />

এটি আমি খুঁজে পেয়েছি এবং এটির পরে আমি প্রোডাকশন সার্ভারে কাস্টম ত্রুটি দেখতে পাচ্ছি final


8
এটি এখনও একটি আদর্শ সমাধান নয়। এটি আপনাকে সঠিক HTTP প্রতিক্রিয়া কোডগুলি পায় না। customErrors302 এর ফলাফলগুলি ব্যবহার করে কেবল আপনার ত্রুটি পৃষ্ঠাটি লোড করতে পুনঃনির্দেশ করুন।
জাস্টিন হেলগারসন

@ এক0nomik আমি কখনই আদর্শ সমাধান দেখতে পাইনি :)
অ্যান্ড্রু ওরিচ

2
@ জাস্টিনহেলজারসন আমি প্রতিটি স্ট্যাটাস কোডের জন্য একটি ত্রুটি নিয়ন্ত্রণকারী সেটআপ করি এবং সেই ক্রিয়াগুলির মধ্যে রেসপন্স কোডগুলি সেট করি এবং এটি প্রতিক্রিয়া কোডগুলি সূক্ষ্ম সেট করে .. উভয় ক্ষেত্রেই আমার কাস্টম ত্রুটির দৃষ্টিভঙ্গি দেওয়া হবে
শেন নিউউভিল

আমার দলের সঙ্গী মাত্র ত্রুটি দৃশ্য মুছে ফেলা অধীনে ভাগ করা ফোল্ডার 500 স্থিতি কোড সহ রানটাইম এরর করতে কাস্টম ত্রুটি পৃষ্ঠা পুনর্চালনা হিসাবে উল্লেখ করেছে এখানে এবং এখানে । আশা কাউকে সাহায্য করে।
শাইজুট

41

এই ত্রুটিটি নিয়ন্ত্রণ করার জন্য একটি ত্রুটি নিয়ন্ত্রণকারী তৈরি করে আমি কাজ করতে আমার ত্রুটি পেয়েছি hand গ্লোবাল.এক্স্যাক্সের রুটে আমাকে "সমস্ত ক্যাচ" যুক্ত করতে হয়েছিল।

আমি যদি দেখতে পাচ্ছি না যে এটি যদি ওয়েবকনফাইগে না থাকে তবে এই ত্রুটিযুক্ত পৃষ্ঠাগুলির কোনওটিতে এটি কীভাবে আসবে ..? আমার ওয়েবকনফাইগকে উল্লেখ করতে হয়েছিল:

customErrors mode="On" defaultRedirect="~/Error/Unknown"

এবং তারপরে আমি আরও যোগ করেছি:

error statusCode="404" redirect="~/Error/NotFound"

2
ধন্যবাদ - যা আমাকে 2 বছর পরে সাহায্য করেছে! আপনি যদি 404 এর জন্য কেবলমাত্র কাস্টম ত্রুটি চান তবে আপনি কি করবেন?
শৌল বেহর

1
@ শৌল আরও এক বছর পরে ... ডিফল্ট পুনর্নির্দেশ সেট করবেন না, গুণটি পুরোপুরি বাদ দিন।
এনজেই

27

উৎস

নটফাউন্ডএমভিসি - যখনই আপনার এএসপি.নেট এমভিসি 3 অ্যাপ্লিকেশনটিতে কোনও নিয়ামক, ক্রিয়া বা রুট না পাওয়া যায় তখন ব্যবহারকারী-বান্ধব 404 পৃষ্ঠা সরবরাহ করে। নটফাউন্ড নামক একটি ভিউ ডিফল্ট ASP.NET ত্রুটির পৃষ্ঠার পরিবর্তে রেন্ডার করা হয়।

আপনি এই প্লাগইনটি ব্যবহার করে নুজেটের মাধ্যমে যুক্ত করতে পারেন: ইনস্টল-প্যাকেজ নটফাউন্ডএমভিসি

নটফাউন্ডএমভিসি ওয়েব অ্যাপ্লিকেশন শুরু করার সময় স্বয়ংক্রিয়ভাবে নিজেকে ইনস্টল করে। এটি 404 এইচটিপিএক্সসেপশন সাধারণত এএসপি.নেট এমভিসি দ্বারা নিক্ষেপ করা সমস্ত বিভিন্ন উপায়ে পরিচালনা করে। এর মধ্যে রয়েছে একটি নিখোঁজ নিয়ামক, ক্রিয়া এবং রুট।

ধাপে ধাপে ইনস্টলেশন গাইড:

1 - আপনার প্রকল্পে ডান ক্লিক করুন এবং নিউজ প্যাকেজগুলি পরিচালনা করুন ...

2 - এটি অনুসন্ধান করুন NotFoundMvcএবং ইনস্টল করুন। এখানে চিত্র বর্ণনা লিখুন

3 - ইনস্টলেশনটি শেষ হয়ে গেলে আপনার প্রকল্পে দুটি ফাইল যুক্ত হবে। নীচের স্ক্রিনশটগুলিতে প্রদর্শিত হিসাবে।

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

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

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

আর নেই, ব্যবহারকারীরা যেমন ত্রুটির বার্তা পাবে Server Error in '/' Application. The resource cannot be found.

আশাকরি এটা সাহায্য করবে :)

পিএস: এ জাতীয় দুর্দান্ত প্লাগ ইন করার জন্য অ্যান্ড্রু ডেভিকে কুদোস ।


@niico উত্স কোডটি দেখে এটি প্রতিক্রিয়া কোডটি 404 এ সেট করে দেখা যাচ্ছে, তাই হ্যাঁ।
ডিন হবে

20

আইআইএস ত্রুটি পৃষ্ঠাগুলি প্রতিস্থাপনের জন্য এটি ওয়েব কোডফাইজে চেষ্টা করুন। এটি আমার অনুমানের সেরা সমাধান এবং এটি সঠিক স্থিতির কোডটিও প্রেরণ করে।

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="500" subStatusCode="-1" />
    <error statusCode="404" path="Error404.html" responseMode="File" />
    <error statusCode="500" path="Error.html" responseMode="File" />
  </httpErrors>
</system.webServer>

টিপিলা থেকে আরও তথ্য - কাস্টম ত্রুটি পৃষ্ঠা ASP.NET এমভিসি ব্যবহার করুন


1
+1 টি। এটি একমাত্র জিনিস যা আমার পক্ষে একাধিক অঞ্চল নিয়ে এমভিসি 5 তে ধারাবাহিকভাবে কাজ করে বলে মনে হয়েছিল।
হক্কে

এটি সবচেয়ে সহজ সমাধান। আপনি যদিও ত্রুটি পৃষ্ঠায় রেজার সিনট্যাক্স ব্যবহার করতে পারবেন না।
হাইগাছ

15

এই সমাধানটির জন্য ওয়েবকনফিগ ফাইল পরিবর্তন বা ক্যাপ-সমস্ত রুটের প্রয়োজন নেই।

প্রথমে এর মতো একটি নিয়ামক তৈরি করুন;

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Regular Error";
        return View();
    }

    public ActionResult NotFound404()
    {
        ViewBag.Title = "Error 404 - File not Found";
        return View("Index");
    }
}

তারপরে "ভিউ / ত্রুটি / সূচি / সূচিপত্র" এর অধীনে দৃশ্যটি তৈরি করুন;

 @{
      Layout = "~/Views/Shared/_Layout.cshtml";
  }                     
  <p>We're sorry, page you're looking for is, sadly, not here.</p>

তারপরে নিচের মতো গ্লোবাল অ্যাস্যাক্স ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন:

protected void Application_Error(object sender, EventArgs e)
{
        // Do whatever you want to do with the error

        //Show the custom error page...
        Server.ClearError(); 
        var routeData = new RouteData();
        routeData.Values["controller"] = "Error";

        if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404))
        {
            routeData.Values["action"] = "Index";
        }
        else
        {
            // Handle 404 error and response code
            Response.StatusCode = 404;
            routeData.Values["action"] = "NotFound404";
        } 
        Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line
        IController errorsController = new ErrorController();
        HttpContextWrapper wrapper = new HttpContextWrapper(Context);
        var rc = new System.Web.Routing.RequestContext(wrapper, routeData);
        errorsController.Execute(rc);

        Response.End();
}

এটি করার পরেও যদি আপনি কাস্টম আইআইএস ত্রুটি পৃষ্ঠাটি পান তবে ওয়েব কনফিগ ফাইলে নিম্নলিখিত বিভাগগুলি মন্তব্য করা হয়েছে তা নিশ্চিত করুন:

<system.web>
   <customErrors mode="Off" />
</system.web>
<system.webServer>   
   <httpErrors>     
   </httpErrors>
</system.webServer>

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

আমি যুক্ত করতে চাই আপনি যদি এই পদ্ধতির সাথে যান তবে আমি Response.End();আপনার অ্যাপ্লিকেশন_এররর হ্যান্ডলারটির শেষে একটি যুক্ত করার পরামর্শ দেব recommend এটি ব্যতীত, প্রদত্ত অধিবেশনের জন্য শুধুমাত্র ত্রুটির প্রথম ঘটনা ঘটবে যা আপনার যখন উদাহরণস্বরূপ, অ্যাপ্লিকেশন_আরর হ্যান্ডলারে কাস্টম ত্রুটি লগইন করার সময় একটি সমস্যা।
কিথ

6

আপনি যদি এমভিসি 4 এ কাজ করেন, আপনি এই সমাধানটি দেখতে পারেন , এটি আমার পক্ষে কাজ করেছিল।

নিম্নলিখিতটিতে আমার অ্যাপ্লিকেশন_অরার পদ্ধতি যুক্ত করুন Global.asax:

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

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

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    IController controller = new ErrorController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();

নিয়ামক নিজেই খুব সহজ:

public class ErrorController : Controller
{
    public ActionResult Index(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        return View();
    }
}

গিটহাবের এমভিসি 4 কাস্টম এরিরপেজের সম্পূর্ণ উত্স কোডটি দেখুন ।


0

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


0

এখানে সঠিক উত্তর যা একক জায়গায় ত্রুটি পৃষ্ঠাটিকে সম্পূর্ণরূপে কাস্টমাইজ করতে দেয়। ওয়েব কোডসিগ পরিবর্তন করতে বা আলাদা কোড তৈরি করার দরকার নেই।

এমভিসি 5 এও কাজ করে।

নিয়ামকটিতে এই কোডটি যুক্ত করুন:

        if (bad) {
            Response.Clear();
            Response.TrySkipIisCustomErrors = true;
            Response.Write(product + I(" Toodet pole"));
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            //Response.ContentType = "text/html; charset=utf-8";
            Response.End();
            return null;
        }

Http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages- এর ভিত্তিতে


0

আমি কিছু নির্দিষ্ট ক্ষেত্রে সম্পর্কে কথা বলতে হবে,

যদি আপনি নীচের মত হোমকন্ট্রোলারে 'পেজনাটফাউন্ড পদ্ধতি' ব্যবহার করছেন

[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

এটি এই কাজ করবে না। তবে আপনাকে অবশ্যই নীচের মতো রুট ট্যাগগুলি সাফ করতে হবে,

//[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

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

<customErrors mode="On">
  <error statusCode="404" redirect="~/PageNotFound" /> 
 *// it is not "~/404" because it is not accepted url in Route Tag like [Route("404")]*
</customErrors>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.