2011-04-14 11 views
8

को संभालने में नहीं है प्रश्न: कस्टम त्रुटि हैंडलिंग मौजूदा गैर-मौजूदा पथ/निर्देशिकाओं के लिए क्यों काम नहीं कर रही है?कस्टम त्रुटि वेब.कॉन्फिग/ग्लोबल.एएसएक्स में हैंडलिंग गैर-मौजूद निर्देशिका

निश्चित कोड के साथ अपडेट किया (आप के लिए हर किसी के लिए धन्यवाद इनपुट):

* web.config के लिए कोड अपडेट किया गया और Global.asax *

<httpErrors errorMode="Custom"> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" subStatusCode="-1" prefixLanguageFilePath="" path="/*****.aspx" responseMode="ExecuteURL" /> 
     <error statusCode="500" subStatusCode="-1" prefixLanguageFilePath="" path="/*****.aspx" responseMode="ExecuteURL"/> 
    </httpErrors> 

    added this to the global.asax to stop IIS from handling my 500 errors 
    after @Kev's suggestions IIS handled my 500's these lines fixed that 
    HttpApplication myApplication = new HttpApplication(); 
    myApplication.Response.TrySkipIisCustomErrors = true; 

हम एक साइट है web.config और global.asax में कस्टम त्रुटि हैंडलिंग के साथ सेटअप (सेटअप नीचे दिखाया गया है)। हम सभी 404 और 500 के बिना किसी समस्या के हैंडल करने में सक्षम हैं। त्रुटियों को Application_Error में global.asax में पकड़ा गया है, डीबी में लॉग इन किया गया है और फिर HttpContext का उपयोग करके हम स्थिति कोड सेट करते हैं और उपयोगकर्ता को उचित त्रुटि पृष्ठ पर ले जाने के लिए Server.Transfer() का उपयोग करते हैं (रीडायरेक्ट 302 का कारण बनता है, और एसईओ को नुकसान पहुंचाता है)।

समस्या तब होती है जब उपयोगकर्ता http://www.example.com/whatever में टाइप करता है एक खाली पृष्ठ फ़ायरफ़ॉक्स में दिखाया गया है और आईई में यह आईई 404 पेज दिखाता है। फायरबग दिखाता है कि कोई स्टेटस कोड निकाल दिया जा रहा है, और जब मैं समाधान डीबग करता हूं, तो मैंने सेट किए गए ब्रेकपॉइंट्स को global.asax में हिट नहीं किया जाता है। अजीब चीज यह है कि कोई उपयोगकर्ता http://www.example.com/whatever/hmm.aspx दर्ज कर सकता है और एक त्रुटि मारा जाएगा। ऐसा लगता है कि यह केवल गैर-मौजूदा पृष्ठों पर काम कर रहा है, न कि पथ/निर्देशिका जो मौजूद नहीं हैं।

त्रुटियों के लिए मेरा web.config कोड और आवेदन त्रुटि के लिए मेरे global.asax कोड नीचे है।

मैं जोड़ दिया है * * जानकारी को छिपाने के लिए, वे उन्हें में मान्य .aspx पृष्ठों है:

वेब config:

<customErrors defaultRedirect="~/******.aspx" mode="On" 
       redirectMode="ResponseRewrite"> 
    <error statusCode="500" redirect="~/*****.aspx" /> 
    <error statusCode="404" redirect="~/*****.aspx" /> 
</customErrors> 

    <httpErrors errorMode="Custom"> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" subStatusCode="-1" prefixLanguageFilePath="" path="/*****.aspx" responseMode="ExecuteURL" /> 
     <error statusCode="500" subStatusCode="-1" prefixLanguageFilePath="" path="/*****.aspx" responseMode="ExecuteURL"/> 
    </httpErrors> 

कोड:

protected void Application_Error(Object sender, EventArgs e) 
{ 
    // At this point we have information about the error 
    HttpContext ctx = HttpContext.Current; 

    // set the exception to the Context 
    Exception exception = ctx.Server.GetLastError(); 

    // get the status code of the Error 
    int httpCode = ((HttpException)exception).GetHttpCode(); 

    // get the IP Address 
    String strHostName = string.Empty; 
    String ipAddress_s = string.Empty; 
    strHostName = System.Net.Dns.GetHostName(); 

    System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostByName(strHostName); 
    System.Net.IPAddress[] addr = ipEntry.AddressList; 

    for (int i = 0; i < addr.Length; i++) 
    { 
     ipAddress_s += "IP Address {" + (i + 1) + "} " + 
          addr[i].ToString() + Environment.NewLine; 
    } 

    // setup the error info one for user display and one for the DB Insert 
    string errorInfo = 
     "<br /><b>Error Location:</b> " + ctx.Request.Url.ToString() + 
     "<br /><br /><b>Error Source:</b> " + exception.Source + 
     "<br /><br /><b>Error Try/Catch:</b> " + exception.InnerException + 
     "<br /><br /><b>Error Info:</b> " + exception.Message + 
     "<br /><br /><b>Status Code:</b> " + httpCode + 
     "<br /><br /><b>Stack trace:</b> " + exception.StackTrace; 
    string errorInfoDB = 
     "||Error Location: " + ctx.Request.Url.ToString() + 
     "||Error Source: " + exception.Source + 
     "||Error Try/Catch: " + exception.InnerException + 
     "||Error Info: " + exception.Message + 
     "||HttpErrorCode: " + httpCode + 
     "||Stack trace: " + exception.StackTrace + 
     "||IP Address: " + ipAddress_s; 

    // clean the input befor you put it in the DB 
    char quote = (char)34; 
    char filler = (char)124; 
    char tick = (char)39; 
    char greaterThan = (char)60; 
    char lessThan = (char)62; 
    errorInfo = errorInfo.Replace(quote, filler); 
    errorInfo = errorInfo.Replace(tick, filler); 
    errorInfo = errorInfo.Replace(greaterThan, filler); 
    errorInfo = errorInfo.Replace(lessThan, filler); 

    errorInfoDB = errorInfoDB.Replace(quote, filler); 
    errorInfoDB = errorInfoDB.Replace(tick, filler); 
    errorInfoDB = errorInfoDB.Replace(greaterThan, filler); 
    errorInfoDB = errorInfoDB.Replace(lessThan, filler); 

    string pattern = string.Empty; 
    string replacement = "sQueEl"; 
    pattern = "/cookie|SELECT|UPDATE|INSERT|INTO|DELETE|FROM|NOT IN|WHERE|TABLE|DROP|script*/ig"; 
    errorInfoDB = Regex.Replace(errorInfoDB, pattern, replacement); 

    pattern = "/cookie|select|update|insert|into|delete|from|not in|where|table|drop|script*/ig"; 
    errorInfoDB = Regex.Replace(errorInfoDB, pattern, replacement); 


    if (httpCode == 404) 
    { 
     InSert_To_DB_Class(*****, *****, *****, *****, *****, errorInfoDB); 
    } 
    else 
    { 
     InSert_To_DB_Class(*****, *****, *****, *****, *****, errorInfoDB); 
    } 

    // set the error info to the session variable to display to the allowed users 
    Application["AppError"] = errorInfo; 

    // clear the error now that is has been stored to a session 
    ctx.Server.ClearError(); 
    ctx.Response.ClearHeaders(); 
    // set the status code so we can return it for SEO 
    ctx.Response.StatusCode = httpCode; 
    ctx.Response.TrySkipIisCustomErrors = true; 
    HttpApplication myApplication = new HttpApplication(); 
    myApplication.Response.TrySkipIisCustomErrors = true; 
    try 
    { 
     if (ctx.Request.RawUrl.Contains("/*****")) 
     { 
      // redirect to the error page 
      ctx.Server.Transfer("~/*****.aspx", false); 
     } 
     else if(ctx.Request.RawUrl.Contains("/*****")) 
     { 
      ctx.Server.Transfer("~/*****/*****.aspx", false); 
     } 
     else 
     { 
      // check the httpCode 
      if (httpCode == 404) 
      { 
       // set the page name they were trying to find to a session variable 
       // this will be cleared in the ****** page 
       Application["404_page"] = exception.Message; 
       // redirect to the 404 page 
       ctx.Server.Transfer("~/*****", false); 
      } 
      else 
      { 
       // redirect to the error page 
       ctx.Server.Transfer("~/*****", false); 
      } 
     } 
    } 
} 
+0

आपका कॉन्फ़िगरेशन नमूना अमान्य है - कृपया संवेदनशील डेटा को घटाकर _actual_ स्निपेट पोस्ट करें। –

उत्तर

25

को यह टिप्पणी से श्री निराशा:

धन्यवाद, मैं लाइव पर आईआईएस 7 स्थानीय और आईआईएस 7.5 का उपयोग कर रहा हूं। जब आपको सामग्री मिलती है तो मुझे बताएं।

यदि आपका एप्लिकेशन क्लासिक पाइपलाइन मोड में चलाने के लिए कॉन्फ़िगर किए गए एप्लिकेशन पूल में चल रहा है तो एएसपी.NET के लिए सामग्री का उद्देश्य ASP.NET रनटाइम नहीं मारा जाएगा। यानी फ़ोल्डर्स जो मौजूद नहीं हैं। इन्हें सीधे आईआईएस द्वारा संभाला जाएगा।

आप एक जोड़े विकल्प हैं:

  1. एकीकृत पाइपलाइन मोड के लिए अनुप्रयोग पूल सेट करें। आवेदन अच्छी तरह से "एकीकृत पाइपलाइन" से व्यवहार नहीं कर रहा है

    <configuration> 
        <system.webServer> 
        <httpErrors existingResponse="PassThrough" /> 
        </system.webServer> 
    </configuration> 
    
  2. : तुम भी यदि आईआईएस की त्रुटि हैंडलिंग "खाती" अपने ASP.NET 404 और ASP.NET से 500 स्थिति कोड निम्नलिखित की स्थापना कॉन्फ़िगर करने के लिए आवश्यकता हो सकती है मोड लेकिन तुम सिर्फ एक पेज 404 प्रतिक्रिया के लिए प्रदर्शित कर चिंतित है उसके बाद निम्न कॉन्फ़िगर करें:

    <system.webServer> 
        <httpErrors> 
        <remove statusCode="404" subStatusCode="-1" /> 
        <error statusCode="404" prefixLanguageFilePath="" 
          path="/404.aspx" responseMode="ExecuteURL" /> 
        </httpErrors> 
    </system.webServer> 
    

    आप अन्यथा यह सिर्फ वापस आ जाएंगे, एक 200, पेज में 404 स्थिति कोड निर्धारित करने की आवश्यकता होगी ।

    आप एक स्थिर पेज, उदाहरण के लिए उपयोग करते हैं:

    <error statusCode="404" prefixLanguageFilePath="" 
         path="404.html" responseMode="File" /> 
    

    यह एक 404 वापस आ जाएगी।

  3. यदि एप्लिकेशन "एकीकृत पाइपलाइन" मोड में अच्छी तरह से व्यवहार नहीं किया जाता है और आपको अपने त्रुटि हैंडलर के माध्यम से पूरी तरह से 404 त्रुटियां पारित करनी होंगी तो आपको एएसपी.NET HttpHandler में वाइल्डकार्ड सामग्री मैन्युअल रूप से मैप करना पड़ सकता है ताकि ऐसे अनुरोध हिट हो जाएं पाइपलाइन यह एक उप-इष्टतम समाधान होगा।

+0

धन्यवाद केवी। मैंने आपके कुछ सुझाव दिए हैं और अब एक अस्तित्व पथ/निर्देशिका के लिए आईआईएस 404.0 पृष्ठ प्राप्त करें। मैंने को हटा दिया है, जो अब आईआईएस पृष्ठ दिखाता है। मुझे अभी भी एएसपी.नेट में आग लगने में परेशानी हो रही है। मैंने http://learn.iis.net/page.aspx/508/wildcard-script-mapping-and-iis-7-integrated-pipeline/ में सुझावों का प्रयास किया है, लेकिन ऐसा कोई प्रभाव नहीं पड़ता है। फिर से मेरी सभी त्रुटि हैंडलिंग की गई है, global.asax में मैं इसके लिए किसी भी कस्टम मॉड्यूल का उपयोग नहीं कर रहा हूं। ऐसा लगता है कि मुझे सिर्फ एक और भाग की आवश्यकता है इसलिए आईआईएस अनुरोध को संभाल नहीं पाएगा। – Kaos

+0

@ काओस - क्या आपका पूल क्लासिक या एकीकृत पाइपलाइन मोड में चल रहा है – Kev

+1

@ केव अब काम कर रहा है। नीचे मैंने web.config में क्या किया है। <स्थिति हटाएं कोड = "500" subStatusCode = "- 1" /> <स्थिति हटाएं कोड = "404" subStatusCode = "- 1" /> <त्रुटि स्थिति कोड = "404" subStatusCode = "-1" prefixLanguageFilePath = "" पथ = "/ *****। एएसपीएक्स" प्रतिक्रिया मोड = "ExecuteURL" /> <त्रुटि स्थिति कोड = "500" उपसर्ग भाषाभाषाफाइल = "" पथ = "/ *****। एचटीएम "प्रतिक्रिया मोड =" ExecuteURL "/> Kaos

4

एएसपी। आईआईएस द्वारा नेट का कभी भी आह्वान नहीं किया जा रहा है। आईआईएस पृष्ठ अनुरोध को संभालता है, देखता है कि पृष्ठ मौजूद नहीं है, और एएसपी.नेट कभी लोड नहीं होता है।

यदि आप एएसपी.NET लोड करना चाहते हैं तो फ़ाइल लोड होने के बावजूद लोड होने के लिए, आपको अपनी आईआईएस कॉन्फ़िगरेशन को बदलने की आवश्यकता है। क्या आप आईआईएस 6 या आईआईएस 7/7.5 का उपयोग कर रहे हैं?

+0

धन्यवाद, मैं लाइव सर्वर (ओं) – Kaos

+0

पर आईआईएस 7 स्थानीय और आईआईएस 7.5 का उपयोग कर रहा हूं, मैं इसे कैसे सेट अप कर सकता हूं ताकि – Kaos

+2

पर ध्यान दिए बिना एएसपीनेट लोड हो जाए, यहां सभी अनुरोधों को संभालने के बारे में कुछ जानकारी दी गई है, आईआईएस 7/7.5 जानकारी शुरू होती है पृष्ठ के नीचे के रास्ते के बारे में: [लिंक] (http://learn.iis.net/page.aspx/508/wildcard-script-mapping-and-iis-7-integrated-pipeline/) महत्वपूर्ण भाग अंत में है; आपको 'runAllManagedModulesForAllRequests' को 'True' पर सेट करने की आवश्यकता है। –

0

मैं इस के लिए स्रोत सामग्री नहीं मिल सकता है, लेकिन मेरा मानना ​​है कि समस्या तथ्य यह कस्टम त्रुटि हैंडलिंग है पृष्ठों और पथ नहीं में निहित है।

www.mysite.com/nonexistingpath/nonexistingpage.aspx 

यह सही त्रुटि पेज हिट करने के लिए चाहिए:

आप जांच आप यद्यपि के रूप में इस गुजारा चलता है। निम्नलिखित कार्य नहीं करेंगे:

www.mysite.com/nonexistingpath/ 

दोहराती है आप पहले से ही अपने स्वयं के सवाल का जवाब देने के लिए, लेकिन मैं अगर मैं संदर्भ सामग्री प्राप्त कर सकते हैं देखेंगे इस तरह की। आखिरकार, यह एक पृष्ठ अनुरोध नहीं है, इसलिए उचित हैंडलरों के माध्यम से कोई आईएसएपीआई हैंडलिंग नहीं है।

+0

धन्यवाद, मैं लाइव पर आईआईएस 7 स्थानीय और आईआईएस 7.5 का उपयोग कर रहा हूं। जब आपको सामग्री मिलती है तो मुझे बताएं। – Kaos

+0

@ काओस: क्रंची/चार्ली द्वारा प्रदान किए गए किसी भी लिंक के साथ कोई सफलता नहीं? वे _how_ प्रदान करते हैं, भले ही _why_ नहीं। –

+0

क्रंची/चार्ली द्वारा प्रदान किए गए लिंक में कुछ मदद की लेकिन मुझे आवश्यक समाधान में नहीं मिला। – Kaos

3

आप इतना है कि सभी अनुरोधों को नेट

के माध्यम से जाने

अगर आपके IIS6 का उपयोग कर वाइल्डकार्ड मानचित्रण सेट करने की आवश्यकता नीचे दिए गए लिंक आप बाहर की मदद करनी चाहिए:

http://professionalaspnet.com/archive/2007/07/27/Configure-IIS-for-Wildcard-Extensions-in-ASP.NET.aspx

वाइल्डकार्ड स्क्रिप्ट मानचित्रण और आईआईएस 7 एकीकृत पाइपलाइन:

http://learn.iis.net/page.aspx/508/wildcard-script-mapping-and-iis-7-integrated-pipeline/

+0

धन्यवाद, मैं स्थानीय पर आईआईएस 7 और लाइव पर आईआईएस 7.5 का उपयोग कर रहा हूं। – Kaos

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