ASP.NET कस्टम 404 रिटर्निंग 404 के बजाय 200 ओके नहीं मिला


80

Google वेबमास्टर टूल के लिए अपनी साइट को सेटअप करने की कोशिश करने के बाद मैंने पाया कि मेरा कस्टम ASP.NET 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 में कस्टम त्रुटि पृष्ठों को कॉन्फ़िगर कर रहा हूं। मैं वास्तव में विकल्प के पीछे कोड का उपयोग करूंगा, लेकिन मैं डिजाइन / लेआउट में हैक इनलाइन कोड डाले बिना इसे काम करने के लिए प्रतीत नहीं कर सकता।


ब्राउज़र क्या कहता है? मैं फ़ायरफ़ॉक्स के लिए addon हैडर जासूस का उपयोग करता हूं।
बॉबी तोप

हेडर स्पाई रिस्पांस: HTTP / 1.1 404 नहीं मिला दिनांक: सूर्य, 07 दिसंबर 2008 06:21:20 GMT
रयान कुक

क्या आप एक मास्टर पृष्ठ का उपयोग कर रहे हैं? शायद यह बात है। मैं बिना मास्टर पेज का उपयोग किए एक पृष्ठ
आज़माऊंगा

नहीं, मैं नहीं था, लेकिन मैं एक त्वरित जांच भी कर सकता हूं, मैं इसे एक के साथ करने की कोशिश करूंगा।
रयान कुक

हाँ, यह है! मास्टर पेज का कारण एक 200 ठीक है
रयान कुक

जवाबों:


72

उपाय:

समस्या, यह निकला, मास्टर पेज का उपयोग था। मुझे बाद में पृष्ठों के जीवन चक्र में स्थिति कोड सेट करके काम करने के लिए मिला, जाहिर है मास्टर पृष्ठ का प्रतिपादन इसे रीसेट कर रहा था, इसलिए मैं रेंडर विधि को ओवररोड करता हूं और रेंडर पूरा होने के बाद इसे सेट करता हूं।

protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.StatusCode = 404;
}

जब मास्टर पेज स्टेटस सेट कर रहा होता है, तो वास्तव में यह पता लगाने के लिए अधिक काम किया जा सकता है, लेकिन मैं आपको छोड़ दूँगा।


मूल पोस्ट:

मैं ठीक काम करने के लिए एक परीक्षण वेब ऐप प्राप्त करने में सक्षम था, अच्छी तरह से यह कम से कम कस्टम त्रुटि पृष्ठ प्रदर्शित करता था और 404 स्थिति कोड लौटाता था। मैं आपको नहीं बता सकता कि आपके ऐप में क्या गलत है, लेकिन मैं आपको बता सकता हूं कि मैंने क्या किया:

1) कस्टम त्रुटियों के लिए web.config का संपादन किया:

<customErrors mode="On">
  <error statusCode="404" redirect="404.aspx"/>
</customErrors>

2) एक 404.aspx पेज जोड़ा और 404 पर स्टेटस कोड सेट किया।

public partial class _04 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.StatusCode = 404;
    }
}

इसके बारे में Thats, अगर मैं Asp.Net द्वारा संसाधित किसी भी पृष्ठ एक्सटेंशन पर जाता हूं और मौजूद नहीं है, तो मेरा फ़िडलर लॉग 404 दिखाता है, यहाँ हैडर है:

HTTP/1.1 404 Not Found
Server: Microsoft-IIS/5.1
Date: Sun, 07 Dec 2008 06:04:13 GMT
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 533

अब अगर मैं एक ऐसे पृष्ठ पर जाता हूं जो Asp.Net द्वारा संसाधित नहीं किया जाता है, तो htm फ़ाइल की तरह, कस्टम पृष्ठ नहीं दिखाता है और IIS द्वारा कॉन्फ़िगर किया गया 404 प्रदर्शित होता है।

यहां एक पोस्ट है जो कुछ और विवरणों में जाती है जो आपके और आपकी समस्या के लिए उपयोग हो सकते हैं, मेरा परीक्षण नए पृष्ठ पर पुनर्निर्देशित करता है इसलिए अनुरोधित फ़ाइल का यूआरएल बहुत अधिक खो जाता है (क्वेरी स्ट्रिंग में इसके अलावा) ।

Google 404 और .NET कस्टम त्रुटि पृष्ठ

हैडर जासूस प्रतिक्रिया:

HTTP/1.1 404 Not Found
Date: Sun, 07 Dec 2008 06:21:20 GMT

4
हैडर जासूस ऐड-ऑन है Firefox के लिए हैडर जासूस
Kiquenet

स्थैतिक .htmlकस्टम त्रुटि पृष्ठों के लिए यह कैसे काम करता है ?
ebyrob

28

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

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

Response.TrySkipIisCustomErrors = true;

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

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


12

IIS 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


3
मेरे लिए काम किया! केवल यहाँ समाधान जो काम किया, शायद नोट के रूप में संस्करण के कारण ... अवगत रहें: आप केवल इस समाधान के साथ स्थिर .htm फ़ाइलों का उपयोग कर सकते हैं।
चौकोरंडी

11

कॉल करने के लिए Response.End () को रेंडर करने का प्रयास करें ...

Response.Status = "404 Not Found";
Response.StatusCode = 404;
Response.End();
return;

9

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

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

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


1

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

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

सबसे पहले, web.config का customErrors खंड इस तरह दिखता है:

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

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

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

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();
    }
    }

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

ApplicationErrorHandler वर्ग इस तरह दिखता है:

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 () का उपयोग करना महत्वपूर्ण है, क्योंकि लगभग हर त्रुटि उच्च-स्तरीय अपवाद में लपेटी जाएगी। उदाहरण के लिए, किसी भी aspx पृष्ठ से "थ्रो न्यू System.Exception ()" को करने से HttpUnhandledException इस स्तर पर प्राप्त होगी, न कि एक System.Exception।

"फ़ैक्टरी" कोड सरल है और इस तरह दिखता है:

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();
    }

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

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


0

आप नीचे दिए गए कोड का उपयोग कर सकते हैं:

 Response.TrySkipIisCustomErrors = True
 Response.Status = "404 Not Found"
 Response.AddHeader("Location", "{your-path-to-your-404-page}")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.