2008-12-07 17 views
74

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

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

+0

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

+0

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

+0

क्या आप एक मास्टर पेज का उपयोग कर रहे हैं? शायद यह है। मैं एक मास्टर पेज का उपयोग किए बिना एक पेज आज़माउंगा ... –

उत्तर

68

समाधान:

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

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

यही करने के लिए स्थिति कोड निर्धारित करते हैं, अगर मैं किसी भी पेज exte के लिए जाना nsion कि Asp.Net द्वारा संसाधित किया जाता है और मौजूद नहीं है, मेरी Fiddler लॉग स्पष्ट रूप से एक 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, एक एचटीएम फ़ाइल की तरह, कस्टम पेज नहीं दिखाता है और आईआईएस द्वारा कॉन्फ़िगर किया गया 404 प्रदर्शित होता है।

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

Google 404 and .NET Custom Error Pages

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

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

** हेडर जासूस ** फ़ायरफ़ॉक्स_ – Kiquenet

+0

के लिए एडन _ हैडर जासूस है स्थिर '.html' कस्टम त्रुटि पृष्ठों के लिए यह कैसे काम करता है? – ebyrob

5

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

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

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

27

मैं एक ऐसी ही समस्या थी मैं एक कस्टम (जो ASPX है) 404 पृष्ठ दिखाने के लिए चाहते हैं और यह स्थानीय होस्ट पर ठीक काम किया लेकिन जैसे ही एक दूरस्थ आगंतुक जुड़ा के रूप में वे सामान्य आईआईएस मिलेगा 404.

इसका समाधान

Response.TrySkipIisCustomErrors = true; 

Response.StatusCode को बदलने से पहले जोड़ना था।

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

9

Response.End() प्रतिपादन छोड़ कॉल करके देखें ...

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

आईआईएस 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

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

+0

यह उत्कृष्ट काम किया! समाधान के लिए धन्यवाद। –

0

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

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

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

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

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

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

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

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

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() का उपयोग करना महत्वपूर्ण है, क्योंकि लगभग हर त्रुटि को उच्च-स्तरीय अपवाद में लपेटा जाएगा। उदाहरण के लिए, किसी भी एएसपीएक्स पेज से "नई प्रणाली फेंक दें। अपवाद()" परिणामस्वरूप इस स्तर पर एक 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 के बजाय ट्रांसफर।

उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे