Asp.net এমভিসি 3 তে কাস্টম ত্রুটি পৃষ্ঠা


144

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

সুতরাং ওয়েবসাইটে ঘটে যাওয়া প্রতিটি ত্রুটি এই "ত্রুটি" নিয়ামক (উদাহরণস্বরূপ: "কন্ট্রোলার" বা "অ্যাকশন" পাওয়া যায়নি, 500, 404, ডিবি এক্সেপশন, ইত্যাদি) দ্বারা পরিচালিত হতে পারে।

আমি ওয়েবসাইটের পাথগুলি নির্ধারণ করতে (এবং রুট নয়) সাইটম্যাপ ফাইলটি ব্যবহার করছি।

এই প্রশ্নের উত্তর ইতিমধ্যে দেওয়া হয়েছিল, এটি জুইবজের একটি উত্তর

আমার চূড়ান্ত অ্যাপ্লিকেশন_অরর পদ্ধতিটি হল:

protected void Application_Error() {
//while my project is running in debug mode
if (HttpContext.Current.IsDebuggingEnabled && WebConfigurationManager.AppSettings["EnableCustomErrorPage"].Equals("false"))
{
    Log.Logger.Error("unhandled exception: ", Server.GetLastError());
}
else
{
    try
    {
        var exception = Server.GetLastError();

        Log.Logger.Error("unhandled exception: ", exception);

        Response.Clear();
        Server.ClearError();
        var routeData = new RouteData();
        routeData.Values["controller"] = "Errors";
        routeData.Values["action"] = "General";
        routeData.Values["exception"] = exception;

        IController errorsController = new ErrorsController();
        var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
        errorsController.Execute(rc);
    }
    catch (Exception e)
    {
        //if Error controller failed for same reason, we will display static HTML error page
        Log.Logger.Fatal("failed to display error page, fallback to HTML error: ", e);
        Response.TransmitFile("~/error.html");
    }
}
}

এটি সমর্থন করার জন্য ওয়েবকনফাইগে সেটিংস কী হওয়া উচিত? ব্যক্তিগতভাবে আপনি কোনও https تاফیر সেটিংস অন্তর্ভুক্ত করবেন না?
ফিলিবার্ড

forums.asp.net/p/1782402/4894514.aspx/… এর মতো কিছু দুর্দান্ত টিপস রয়েছে যেমন আইই আপনার ত্রুটি পৃষ্ঠাটি 512 বাইটের নিচে না দেখায়
রিকএন্ডএমএসএফটি

উত্তর:


201

আমি কীভাবে কাস্টম ত্রুটিগুলি পরিচালনা করি তার একটি উদাহরণ এখানে। আমি ErrorsControllerবিভিন্ন HTTP ত্রুটিগুলি পরিচালনা করে এমন ক্রিয়াগুলির সাথে একটি সংজ্ঞায়িত করি :

public class ErrorsController : Controller
{
    public ActionResult General(Exception exception)
    {
        return Content("General failure", "text/plain");
    }

    public ActionResult Http404()
    {
        return Content("Not found", "text/plain");
    }

    public ActionResult Http403()
    {
        return Content("Forbidden", "text/plain");
    }
}

এবং তারপর আমি জন্য সাবস্ক্রাইব Application_Errorমধ্যে Global.asaxএবং এই নিয়ামক ডাকা:

protected void Application_Error()
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;
    Response.Clear();
    Server.ClearError();
    var routeData = new RouteData();
    routeData.Values["controller"] = "Errors";
    routeData.Values["action"] = "General";
    routeData.Values["exception"] = exception;
    Response.StatusCode = 500;
    if (httpException != null)
    {
        Response.StatusCode = httpException.GetHttpCode();
        switch (Response.StatusCode)
        {
            case 403:
                routeData.Values["action"] = "Http403";
                break;
            case 404:
                routeData.Values["action"] = "Http404";
                break;
        }
    }

    IController errorsController = new ErrorsController();
    var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
    errorsController.Execute(rc);
}

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

4
এমভিসি 3 এ এই সমাধানটি ব্যবহার করে আমি রেজার ভিউগুলি পেতে পারি না। রিটার্ন ভিউ (মডেল) উদাহরণ হিসাবে কেবল একটি ফাঁকা স্ক্রিন পায় gets
এক্সট্রাকুন

2
সংহত আইআইএস 7 এর জন্য এটি ঠিক করার জন্য ট্রাইস্কিপআইআইস কাস্টমআরিয়ারগুলি যুক্ত করা হয়েছে। স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা / ১70০ 34

1
@ আজবিভেন, ইন্টারফেসে Executeসংজ্ঞায়িত একটি পদ্ধতি IController। এটি সম্ভবত সুরক্ষিত করা যায় না। আমার কোডটি আরও সাবধানতার সাথে দেখুন: IController errorsController = new ErrorsController();এবং errorsControllerযে Executeপদ্ধতিতে আমি পদ্ধতিটি চালাচ্ছি তার ধরণটি লক্ষ্য করুন । এটি প্রকারের IControllerতাই তাই আপনাকে এই পদ্ধতিটি কল করতে বাধা দেওয়ার মতো কিছুই নেই। এবং উপায় দ্বারা Executeকন্ট্রোলার ক্লাসেও এমভিসি 3 তে সুরক্ষিত ছিল, সুতরাং এই ক্ষেত্রে কোনও পরিবর্তন নেই।
দারিন দিমিত্রভ

2
প্রতিক্রিয়াটির বিষয়বস্তুর ধরণ স্পষ্ট করে উল্লেখ করে স্থির করা হয়েছে:Response.ContentType = "text/html";
আজবাইভেন

18

এখানে আরও নিবন্ধ রয়েছে এমভিসি http://kitsula.com/Article/MVC- কাস্টম- এরর- পৃষ্ঠাগুলি দিয়ে কীভাবে কাস্টম ত্রুটি পৃষ্ঠা তৈরি করা যায় ।


6

আপনি Web.Config ফাইল এ এটি করতে পারেন। এখানে একটি উদাহরণ যা আইআইএস 7.5 এ কাজ করে।

     <system.webServer>
          <httpErrors errorMode="DetailedLocalOnly" defaultResponseMode="File">
                <remove statusCode="502" subStatusCode="-1" />
                <remove statusCode="501" subStatusCode="-1" />
                <remove statusCode="412" subStatusCode="-1" />
                <remove statusCode="406" subStatusCode="-1" />
                <remove statusCode="405" subStatusCode="-1" />
                <remove statusCode="404" subStatusCode="-1" />
                <remove statusCode="403" subStatusCode="-1" />
                <remove statusCode="401" subStatusCode="-1" />
                <remove statusCode="500" subStatusCode="-1" />
                <error statusCode="500" path="/notfound.html" responseMode="ExecuteURL" />
                <error statusCode="401" prefixLanguageFilePath="" path="/500.html" responseMode="ExecuteURL" />
                <error statusCode="403" prefixLanguageFilePath="" path="/403.html" responseMode="ExecuteURL" />
                <error statusCode="404" prefixLanguageFilePath="" path="/404.html" responseMode="ExecuteURL" />
                <error statusCode="405" prefixLanguageFilePath="" path="/405.html" responseMode="ExecuteURL" />
                <error statusCode="406" prefixLanguageFilePath="" path="/406.html" responseMode="ExecuteURL" />
                <error statusCode="412" prefixLanguageFilePath="" path="/412.html" responseMode="ExecuteURL" />
                <error statusCode="501" prefixLanguageFilePath="" path="/501.html" responseMode="ExecuteURL" />
                <error statusCode="502" prefixLanguageFilePath="" path="/genericerror.html" responseMode="ExecuteURL" />
           </httpErrors>
</system.webServer>

3

আমি দেখতে পাচ্ছি যে আপনি এর জন্য একটি কনফিগার মান যুক্ত করেছেন EnableCustomErrorPageএবং আপনি IsDebuggingEnabledনিজের ত্রুটি পরিচালনা পরিচালনা করবেন কিনা তা নির্ধারণের জন্যও পরীক্ষা করে দেখছেন ।

যেহেতু <customErrors/>এএসপি.নেটে ইতিমধ্যে একটি কনফিগারেশন রয়েছে (যা এই উদ্দেশ্যে ঠিক বোঝানো হয়েছিল) কেবল এটি বলা সহজ:

    protected void Application_Error()
    {
        if (HttpContext.Current == null) 
        {
                // errors in Application_Start will end up here                
        }
        else if (HttpContext.Current.IsCustomErrorEnabled)
        {
                // custom exception handling
        }
    }

তারপরে আপনি যে কনফিগারটি <customErrors mode="RemoteOnly" />স্থাপন করবেন সেগুলিতে এটি স্থাপনের জন্য নিরাপদ এবং আপনার কাস্টম ত্রুটি পৃষ্ঠাটি পরীক্ষা করার দরকার হলে আপনি এটি সেট করেছেন <customErrors mode="On" />যাতে আপনি এটি পরীক্ষা করে যাচাই করতে পারেন।

দ্রষ্টব্য আপনারও পরীক্ষা করা দরকার কিনা HttpContext.Current নাল কারণ একটি ব্যতিক্রম Application_Startএখনও তার এই পদ্ধতিটি করবে যদিও সক্রিয় প্রসঙ্গ থাকবে না।


2

আপনি জেফ অ্যাটউডের ইউজার ফ্রেন্ডলি এক্সসেপশন হ্যান্ডলিং মডিউলটি প্রয়োগ করে সঠিক HTTP স্থিতি কোড সহ একটি ব্যবহারকারী-বান্ধব ত্রুটি পৃষ্ঠা প্রদর্শন করতে পারেন HTTP স্থিতির কোডের জন্য সামান্য পরিবর্তন । এটি কোনও পুনর্নির্দেশ ছাড়াই কাজ করে। কোডটি 2004 (!) এর হলেও এটি এমভিসির সাথে ভালভাবে কাজ করে। একেবারেই কোনও এমভিসি প্রকল্পের উত্স কোডের পরিবর্তন না করে এটি পুরোপুরি আপনার ওয়েবকনফিগে কনফিগার করা যেতে পারে।

কোনও স্থিতির পরিবর্তে মূল HTTP স্থিতি ফিরিয়ে আনার জন্য প্রয়োজনীয় পরিবর্তনটি এই সম্পর্কিত ফোরাম পোস্টে200 বর্ণিত হয়েছে ।

মূলত, Handler.vb এ আপনি এর মতো কিছু যুক্ত করতে পারেন:

' In the header...
Private _exHttpEx As HttpException = Nothing

' At the top of Public Sub HandleException(ByVal ex As Exception)...
HttpContext.Current.Response.StatusCode = 500
If TypeOf ex Is HttpException Then
    _exHttpEx = CType(ex, HttpException)
    HttpContext.Current.Response.StatusCode = _exHttpEx.GetHttpCode()
End If

0

আমি এমভিসি 4.5 ব্যবহার করছি এবং ডারিনের সমাধান নিয়ে আমার সমস্যা ছিল। দ্রষ্টব্য: ডারিনের সমাধানটি দুর্দান্ত এবং আমি আমার সমাধানটি ব্যবহার করতে এটি ব্যবহার করেছি। এখানে আমার পরিবর্তিত সমাধান:

protected void Application_Error(object sender, EventArgs e)
{           
var exception = Server.GetLastError();
var httpException = exception as HttpException;
Response.StatusCode = httpException.GetHttpCode();

Response.Clear();
Server.ClearError();


if (httpException != null)
{
    var httpContext = HttpContext.Current;

    httpContext.RewritePath("/Errors/InternalError", false);

    // MVC 3 running on IIS 7+
    if (HttpRuntime.UsingIntegratedPipeline)
    {
        switch (Response.StatusCode)
        {
            case 403:
                httpContext.Server.TransferRequest("/Errors/Http403", true);
                break;
            case 404:
                httpContext.Server.TransferRequest("/Errors/Http404", true);
                break;
            default:
                httpContext.Server.TransferRequest("/Errors/InternalError", true);
                break;
        }
    }
    else
    {
        switch (Response.StatusCode)
        {
            case 403:
                httpContext.RewritePath(string.Format("/Errors/Http403", true));
                break;
            case 404:
                httpContext.RewritePath(string.Format("/Errors/Http404", true));
                break;
            default:
                httpContext.RewritePath(string.Format("/Errors/InternalError", true));
                break;
        }

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

2
ডারিনের সমাধান নিয়ে আপনার কী সমস্যা ছিল?
কেনি এভিট

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