c# - एएसपी.नेट कस्टम 404 रिटर्निंग 200 ओके 404 के बजाय नहीं मिला




asp.net master-pages (4)

Google वेबमास्टर टूल्स के लिए अपनी साइट सेट अप करने का प्रयास करने के बाद मैंने पाया कि मेरा कस्टम एएसपी.नेट 404 पृष्ठ 404 स्टेटस कोड नहीं लौटा रहा था। यह सही कस्टम पेज प्रदर्शित करता है और ब्राउज़र को बताया कि सबकुछ ठीक है। यह नरम 404 या झूठी 404 पर विचार करता है। Google इसे पसंद नहीं करता है। तो मुझे इस मुद्दे पर कई लेख मिले लेकिन मुझे जो समाधान चाहिए वह काम नहीं कर रहा था।

जिस समाधान को मैं काम करना चाहता हूं वह कस्टम 404 पेज के पेज_लोड विधि के पीछे कोड में निम्नलिखित दो पंक्तियां जोड़ रहा है।

Response.Status = "404 Not Found";
Response.StatusCode = 404;

यह काम नहीं करता है। पृष्ठ अभी भी 200 ठीक है। हालांकि मुझे पता चला कि यदि मैं डिज़ाइन कोड में निम्न कोड को हार्ड कोड करता हूं तो यह ठीक से काम करेगा।

<asp:Content ID="ContentMain" ContentPlaceHolderID="ContentPlaceHolderMaster" runat="server">

<%
    Response.Status = "404 Not Found";
    Response.StatusCode = 404;
%>

 ... Much more code ...

</asp:content>

पृष्ठ एक मास्टर पेज का उपयोग कर रहा है। और मैं अपने web.config में कस्टम त्रुटि पृष्ठों को कॉन्फ़िगर कर रहा हूं। मैं वास्तव में विकल्प के पीछे कोड का उपयोग करता हूं लेकिन मैं इसे डिजाइन / लेआउट में हैक इनलाइन कोड डाले बिना काम नहीं कर सकता।


अधिक परीक्षण और समस्या निवारण के बाद ऐसा प्रतीत होता है कि कुछ होस्टिंग प्रदाता रिटर्न कोड में हस्तक्षेप कर सकते हैं। मैं सामग्री में "हैक" लागू करके इसे पाने में सक्षम था।

<%
// This code is required for host that do special 404 handling...
Response.Status = "404 Not Found";
Response.StatusCode = 404;
%>

यह पृष्ठ को सही रिटर्न कोड वापस करने की अनुमति देगा चाहे इससे कोई फर्क नहीं पड़ता।


आईआईएस 7 समाधान सिर्फ इसे अपनी web.config फ़ाइल में जोड़ना है:

<system.webServer>
  <httpErrors existingResponse="Replace">
    <remove statusCode="500" subStatusCode="-1" />
    <remove statusCode="404" subStatusCode="-1" />
    <error statusCode="404" prefixLanguageFilePath="" path="404.htm" responseMode="File" />
    <error statusCode="500" prefixLanguageFilePath="" path="500.htm" responseMode="File" />
  </httpErrors>
</system.webServer>

http://forums.asp.net/t/1563128.aspx/1


मुझे एक ही समस्या थी, मैं एक कस्टम पेज को 404 (जो एएसपीएक्स है) के रूप में दिखाना चाहता हूं और यह लोकहोस्ट पर ठीक काम करता है लेकिन जैसे ही रिमोट विज़िटर कनेक्ट होता है, उन्हें जेनेरिक आईआईएस 404 मिल जाएगा।

इसका समाधान जोड़ना था

Response.TrySkipIisCustomErrors = true;

Response.StatusCode बदलने से पहले।

रिक स्ट्राल http://www.west-wind.com/weblog/posts/745738.aspx माध्यम से मिला


मैं .NET 3.5 का उपयोग कर एएसपीनेट वेबफॉर्म में निम्न सेटअप का उपयोग करके इस समस्या को हल करने में सक्षम था।

जिस पैटर्न को मैंने कार्यान्वित किया है वह वेब.कॉन्फिग में .NET के कस्टम रीडायरेक्ट समाधान को बाईपास करता है क्योंकि मैंने हेडर में सही HTTP स्थिति कोड के साथ सभी परिदृश्यों को संभालने के लिए अपना स्वयं लिखा है।

सबसे पहले, web.config का customErrors अनुभाग इस तरह दिखता है:

<customErrors mode="RemoteOnly" defaultRedirect="~/error.htm" />

यह सेटअप सुनिश्चित करता है कि CustomErrors मोड चालू है, एक सेटिंग जिसे हमें बाद में आवश्यकता होगी, और त्रुटि.htm के डिफ़ॉल्टRedirect के लिए एक अन्य सभी विफल विकल्प प्रदान करता है। यह आसान होगा जब मेरे पास विशिष्ट त्रुटि के लिए हैंडलर नहीं है, या टूटा डेटाबेस कनेक्शन की तरह कुछ है।

दूसरा, यहां वैश्विक एएसएक्स त्रुटि घटना है:

protected void Application_Error(object sender, EventArgs e)
    {
       HandleError();
    }

    private void HandleError()
    {
        var exception = Server.GetLastError();
        if (exception == null) return;

        var baseException = exception.GetBaseException();

        bool errorHandled = _applicationErrorHandler.HandleError(baseException);
        if (!errorHandled) return;


        var lastError = Server.GetLastError();
    if (null != lastError && HttpContext.Current.IsCustomErrorEnabled)
    {
        Elmah.ErrorSignal.FromCurrentContext().Raise(lastError.GetBaseException());
        Server.ClearError();
    }
    }

यह कोड किसी अन्य वर्ग में त्रुटि को संभालने की ज़िम्मेदारी को पार कर रहा है। अगर त्रुटि को संभाला नहीं जाता है और कस्टमरर चालू हो जाता है, तो इसका मतलब है कि हमारे पास एक ऐसा मामला है जहां हम उत्पादन पर हैं और किसी भी तरह से एक त्रुटि को संभाला नहीं गया है। उपयोगकर्ता इसे देखने से रोकने के लिए हम इसे यहां साफ़ कर देंगे, लेकिन इसे एल्मा में लॉग इन करें ताकि हम जान सकें कि क्या हो रहा है।

एप्लिकेशन एरर हैंडलर क्लास इस तरह दिखता है:

public bool HandleError(Exception exception)
        {
            if (exception == null) return false;

            var baseException = exception.GetBaseException();

            Elmah.ErrorSignal.FromCurrentContext().Raise(baseException);

            if (!HttpContext.Current.IsCustomErrorEnabled) return false;

            try
            {

                var behavior = _responseBehaviorFactory.GetBehavior(exception);
                if (behavior != null)
                {
                    behavior.ExecuteRedirect();
                    return true;
                }
            }
            catch (Exception ex)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
            }
            return false;
        }

यह वर्ग अनिवार्य रूप से जारी त्रुटि के प्रकार के लिए उपयुक्त त्रुटि हैंडलर का पता लगाने के लिए कमांड पैटर्न का उपयोग करता है। इस स्तर पर Exception.GetBaseException () का उपयोग करना महत्वपूर्ण है, क्योंकि लगभग हर त्रुटि को उच्च-स्तरीय अपवाद में लपेटा जाएगा। उदाहरण के लिए, किसी भी एएसपीएक्स पेज से "नई प्रणाली फेंक दें। अपवाद ()" परिणामस्वरूप इस स्तर पर एक HttpUnhandledException प्राप्त किया जा रहा है, सिस्टम नहीं। अपवाद।

"कारखाना" कोड सरल है और ऐसा लगता है:

public ResponseBehaviorFactory()
    {
        _behaviors = new Dictionary<Type, Func<IResponseBehavior>>
                        {
                            {typeof(StoreException), () => new Found302StoreResponseBehavior()},
                            {typeof(HttpUnhandledException), () => new HttpExceptionResponseBehavior()},
                            {typeof(HttpException), () => new HttpExceptionResponseBehavior()},
                            {typeof(Exception), () => new Found302DefaultResponseBehavior()}
                        };
    }

    public IResponseBehavior GetBehavior(Exception exception)
    {                                                                               
        if (exception == null) throw new ArgumentNullException("exception");

        Func<IResponseBehavior> behavior;
        bool tryGetValue = _behaviors.TryGetValue(exception.GetType(), out behavior);

        //default value here:
        if (!tryGetValue)
            _behaviors.TryGetValue(typeof(Exception), out behavior);

        if (behavior == null)
            Elmah.ErrorSignal.FromCurrentContext().Raise(
                new Exception(
                    "Danger! No Behavior defined for this Exception, therefore the user might have received a yellow screen of death!",
                    exception));
        return behavior();
    }

अंत में, मुझे एक एक्स्टेंसिबल त्रुटि हैंडलिंग योजना सेटअप मिला है। परिभाषित किए गए "व्यवहार" में से प्रत्येक में, मेरे पास त्रुटि के प्रकार के लिए एक कस्टम कार्यान्वयन है। उदाहरण के लिए, स्टेटस कोड के लिए एक एचटीपी अपवाद का निरीक्षण किया जाएगा और उचित तरीके से संभाला जाएगा। एक 404 स्टेटस कोड को सर्वर की आवश्यकता होगी। हेडर में लिखे उचित स्थिति कोड के साथ, Request.Redirect के बजाय ट्रांसफर।

उम्मीद है की यह मदद करेगा।







custom-errors