IIS7 कस्टमाइज़र्स को ओवरराइड करता है जब Response.StatusCode सेट करते हैं?


98

यहां एक अजीब समस्या है। हर कोई जानता है कि यदि आप customErrorsएक कस्टम त्रुटि पेज बनाने के लिए web.config के सेक्शन का उपयोग करते हैं, तो आपको Response.StatusCodeजो कुछ भी उपयुक्त है, उसे सेट करना चाहिए । उदाहरण के लिए, यदि मैं एक कस्टम 404 पृष्ठ बनाता हूं और इसे 404.aspx नाम देता हूं, तो मैं <% Response.StatusCode = 404 %>इसे सही 404 स्थिति शीर्ष लेख बनाने के लिए सामग्री में डाल सकता हूं ।

मुझे अभी तक का पालन करें? अच्छा। अब इसे IIS7 पर करने का प्रयास करें। मैं इसे काम करने के लिए नहीं कर सकता, अवधि। यदि Response.StatusCodeकस्टम त्रुटि पृष्ठ में सेट किया गया है, तो IIS7 पूरी तरह से कस्टम त्रुटि पृष्ठ को ओवरराइड करता है, और अपना स्वयं का स्थिति पृष्ठ दिखाता है (यदि आपके पास कोई कॉन्फ़िगर है।)

क्या किसी और ने इस व्यवहार को देखा है और शायद यह भी जानता है कि इसके आसपास कैसे काम करना है? यह IIS6 के तहत काम कर रहा था, इसलिए मुझे नहीं पता कि चीजें क्यों बदलीं।

नोट: यह ASP.NET कस्टम 404 में समस्या के समान नहीं है


मेरा भी यही सवाल था। यहाँ पहले से ही उत्तर दिया गया है http://stackoverflow.com/questions/347281/asp-net-custom-404-returning-200-ok-instead-of-404-not-found
बॉबी तोप

बॉबी, मुझे वास्तव में वह सवाल मिला और उसने कोशिश की, लेकिन इसने समस्या को ठीक नहीं किया। लेकिन धन्यवाद।
निकोलस

मैं यह टिप्पणी करना चाहता हूं कि क्लासिक से इंटीग्रेटेड पाइपइन पर स्विच करते समय यह समस्या भी होती है। मैंने @PavelChuchuva समाधान (@RickStrahl समाधान भी काम करता है) का इस्तेमाल किया। मैं अनुमान लगा रहा हूं कि क्लासिक में "passthrough" स्वचालित है, एकीकृत में यह सर्वर की वैश्विक त्रुटि पृष्ठ हैंडलिंग को लेता है ..
sonjz

जवाबों:


116

मौजूदाResponse को PassThrough में system.webServer / httpErrors सेक्शन पर सेट करें:

  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>

मौजूदा संपत्ति का डिफ़ॉल्ट मूल्य ऑटो है:

ऑटो कस्टम त्रुटि मॉड्यूल को सही काम करने के लिए कहता है। ग्राहकों द्वारा देखा गया वास्तविक त्रुटि पाठ IHttpResponse::GetStatusकॉल में दिए गए fTrySkipCustomErrors के मान के आधार पर प्रभावित होगा । जब fTrySkipCustomErrors सही पर सेट होता है, तो कस्टम त्रुटि मॉड्यूल प्रतिक्रिया को गुजरने देगा लेकिन यदि यह गलत पर सेट है, तो कस्टम एरर मॉड्यूल पाठ को अपने पाठ से बदल देता है।

अधिक जानकारी: IIS7 कस्टम त्रुटि मॉड्यूल से क्या अपेक्षा करें


3
ध्यान दें कि PassThrough में मौजूदाResponse सेट करने से कुछ दुष्प्रभाव हो सकते हैं। कृपया किसी भी बदलाव से पहले पावेल द्वारा दिए गए लिंक को मास्टर करें।
लेक्स ली

के <httpErrors existingResponse="PassThrough" />बराबर है Response.TrySkipIisCustomErrorsया वे अलग तरह से व्यवहार करते हैं?
असबजर्न उल्सबर्ग

1
@sbjornu वे एक ही चीज़ हासिल करते हैं लेकिन Response.TrySkipIisCustomErrorsजब आप IIS कस्टम त्रुटियों को प्रदर्शित करने के लिए बेहतर नियंत्रण प्राप्त करते हैं।
पावेल चुचुवा

धन्यवाद, मैंने प्रतिक्रिया के बारे में बहुत सारी जानकारी देखी है। tryskipiiscustomerrors लेकिन मौजूदा के बारे में इतना नहीं।
HBCondo

मैंने कस्टम त्रुटि पेजों के साथ एक समस्या हल की, जो मेरे वेब होस्ट पर काम नहीं कर रही है IIS7 केवल मौजूदा रिप्रजेंटेशन = "ऑटो" सेट करके, जो कि लेख द्वारा दावा किए गए डिफ़ॉल्ट होने के बाद से बहुत आश्चर्यचकित था। यह स्पष्ट रूप से नहीं है ... या मेरी होस्टिंग कंपनी ने अन्यत्र गलत डिफ़ॉल्ट सेट किया है, मुझे लगता है। किसी भी तरह से मुझे उम्मीद है कि कुछ घंटों में किसी को बचाता है: \
एरिक सस्समन

80

व्यवहार को सुसंगत बनाने का सबसे आसान तरीका है त्रुटि को साफ़ करना और Response.TrySkipIisCustomErrors का उपयोग करना और इसे सही पर सेट करना। यह आपके पृष्ठ के भीतर से IIS वैश्विक त्रुटि पृष्ठ हैंडलिंग या Application_Error में वैश्विक त्रुटि हैंडलर को ओवरराइड करेगा।

Server.ClearError();
Response.TrySkipIisCustomErrors = true;

आमतौर पर आपको अपने Application_Error हैंडलर में ऐसा करना चाहिए जो सभी त्रुटियों को हैंडल करता है जो आपके एप्लिकेशन त्रुटि हैंडलर को पकड़ नहीं रहे हैं।

अधिक विस्तृत जानकारी इस ब्लॉग पोस्ट में पाई जा सकती है: http://www.west-wind.com/weblog/posts/745738.aspx


2
यह मेरे (IIS8) के लिए भी काम नहीं करता है, और सलाह ओपी से मेल नहीं खाती है (यह मानते हुए कि मैं इसे सही ढंग से पढ़ रहा हूं)। मैं चाहता हूँcustomError ट्रिगर करने के लिए Web.config में विन्यस्त। साथ Response.TrySkipIisCustomErrors = trueमैं एक ही व्यवहार: बदसूरत सर्वर द्वारा जेनरेट त्रुटि पृष्ठ प्रदर्शित होता है। इसके साथ falseकुछ भी नहीं होता है - एक खाली ब्राउज़र विंडो।
शॉन साउथ

मेरे लिए ठीक काम किया! जबकि उनके उत्तर में पावेल चुचुवा का उल्लेख है कि सेटिंग ने भी काम किया, इसके कुछ दुष्प्रभाव थे जो अन्य मुद्दों का कारण बने। यह सेटिंग मुझे उस विशिष्ट परिदृश्य में IIS त्रुटि को छोड़ने देती है जो मैं चाहता था, जबकि हर चीज के लिए व्यवहार को बरकरार रखते हुए।
केविन बाघे

मेरे लिए Azure में अच्छा काम किया। सर्वर हेडरServer:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
ऑक्सफैन

मुझे अभी भी लगता है कि मुझे customErrors mode="Off"इसके लिए काम करने की जरूरत है । यदि मैं ऐसा करता हूं, तो httpErrors मौजूदाResponse = "ऑटो" (डिफ़ॉल्ट) मेरे लिए ठीक से काम करता है जब मैं इस उत्तर में कोड का उपयोग करता हूं।
एरोनल्स

11

हल किया गया: यह पता चलता है कि IIS7 के लिए "विस्तृत त्रुटियों" का होना आवश्यक है, आपके पास कोई भी त्रुटि पृष्ठ "pststhrough" हो सकता है। Http://forums.iis.net/t/1146653.aspx देखें


1
हालांकि यह एक जवाब के रूप में चिह्नित किया गया था, मुझे लगता है कि इस विषय पर अधिक जानकारी प्राप्त करने के लिए अन्य उत्तरों को पढ़ने के लिए समय की कीमत है।
लेक्स ली

साथ ही इसे हटाना अच्छा हो सकता है। HandleErrorAttribute में FilterConfig
Per G

4

मुझे यकीन नहीं है कि यह प्रकृति में समान है या नहीं, लेकिन मैंने एक मुद्दे को हल किया जो सतह पर समान लगता है और यहां बताया गया है कि मैंने इसे कैसे संभाला।

सबसे पहले, मौजूदाResponse (ऑटो) के लिए डिफ़ॉल्ट मान मेरे मामले में सही उत्तर था, क्योंकि मेरे पास एक कस्टम 404, 400 और 500 है (मैं दूसरों को बना सकता हूं, लेकिन ये तीन जो मैं कर रहा हूं उसके लिए पर्याप्त होगा)। यहां प्रासंगिक अनुभाग हैं जिन्होंने मेरी मदद की।

Web.config से:

<customErrors mode="Off" />

तथा

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/errors/404.aspx" responseMode="ExecuteURL" />
  <error statusCode="500" path="/errors/500.aspx" responseMode="ExecuteURL" />
  <error statusCode="400" path="/errors/400.aspx" responseMode="ExecuteURL" />
</httpErrors>

वहाँ से, मैंने इसे Global_asax पर Application_Error में जोड़ा:

    Response.TrySkipIisCustomErrors = True

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

वैसे भी, मैं यह कैसे किया है। आशा है कि किसी की मदद करता है।


3

यह मुद्दा एक प्रमुख सिरदर्द रहा है। पहले से बताए गए सुझावों में से किसी ने भी मेरे लिए इसे हल नहीं किया, इसलिए मैं अपने समाधान में शामिल हूं। रिकॉर्ड के लिए, हमारा पर्यावरण / मंच उपयोग करता है:

  • .NET फ्रेमवर्क 4
  • MVC 3
  • IIS8 (वर्कस्टेशन) और IIS7 (वेब ​​सर्वर)

विशेष रूप से, मैं एक HTTP 404 प्रतिक्रिया प्राप्त करने की कोशिश कर रहा था जो उपयोगकर्ता को हमारे कस्टम 404 पृष्ठ (Web.config सेटिंग्स के माध्यम से) पर पुनर्निर्देशित करेगी।

सबसे पहले, मेरे कोड को फेंकना था HttpExceptionNotFoundResultकंट्रोलर से लौटने के बाद मुझे जो नतीजे मिले, वह हासिल नहीं हुए।

throw new HttpException(404, "There is no class with that subject");

तब मैं कॉन्फ़िगर करना पड़ा दोनोंcustomErrors और httpErrorWeb.config में नोड्स।

<customErrors mode="On" defaultRedirect="/classes/Error.aspx">
  <error statusCode="404" redirect="/classes/404.html" />
</customErrors>

...

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/classes/404.aspx" responseMode="ExecuteURL" />
</httpErrors>

ध्यान दें कि मैंने उस existingResponseरूप को छोड़ दिया है Auto, जो प्रदान किए गए समाधान @ से अलग है।

customErrorsसेटिंग्स से निपटने मेरी स्पष्ट रूप से फेंक दिया के लिए आवश्यक होने के कारण HttpException, जबकि httpErrorsनोड URL हैं, जो Globals.asax.cs में निर्दिष्ट मार्ग पैटर्न के बाहर गिर गया संभाला।

PS इन सेटिंग्स के साथ मुझे सेट करने की आवश्यकता नहीं थी Response.TrySkipIisCustomErrors


2

TrySkipIisCustomErrorsएक पहेली का एक हिस्सा है। यदि आप Custom Error Pages का उपयोग करते हैं लेकिन आप 4xx स्टेटस के आधार पर कुछ RESTful कंटेंट डिलीवर करना चाहते हैं तो आपको एक समस्या है। Web.config के httpErrors.existingResponse को "Auto" पर सेट करने से काम नहीं चलता, क्योंकि .net हमेशा कुछ पृष्ठ सामग्री को IIS को वितरित करता है, इसलिए "Auto" का उपयोग करने से सभी (या कम से कम कुछ) कस्टम त्रुटि पृष्ठों का उपयोग नहीं किया जा सकता है। "बदलें" का उपयोग करने से भी काम नहीं चलेगा, क्योंकि प्रतिक्रिया में आपका http स्थिति कोड होगा, लेकिन इसकी सामग्री कस्टम त्रुटि पेज से रिक्त या भरी होगी। और "पासथ्रू" वास्तव में सीईपी को बंद कर देता है, इसलिए इसका उपयोग नहीं किया जा सकता है।

इसलिए यदि आप कुछ मामलों के लिए सीईपी को बायपास करना चाहते हैं (मेरा मतलब है कि कुछ सामग्री के साथ वापसी की स्थिति 4xx है) तो आपको अतिरिक्त कदम की आवश्यकता होगी: त्रुटि को साफ करें:

void Application_Error(object sender, EventArgs e)
{
    var httpException = Context.Server.GetLastError() as HttpException;
    var statusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError;

    Context.Server.ClearError();
    Context.Response.StatusCode = statusCode;
}

इसलिए यदि आप REST प्रतिसाद (यानी 400 - खराब अनुरोध) का उपयोग करना चाहते हैं और इसके साथ कुछ सामग्री भेजना चाहते हैं, तो आपको बस TrySkipIisCustomErrorsकार्रवाई में कहीं और सेट existingResponseकरना होगा और web.config में httpErrors अनुभाग में "ऑटो" पर सेट करना होगा। अभी:

  • जब कोई त्रुटि नहीं होती है (कार्रवाई 4xx या 5xx लौटाती है) और कुछ सामग्री लौटा दी जाती है सीईपी का उपयोग नहीं किया जाता है और सामग्री क्लाइंट को दे दी जाती है;
  • जब कोई त्रुटि होती है (अपवाद फेंका जाता है) तो त्रुटि हैंडलर द्वारा दी गई सामग्री हटा दी जाती है, इसलिए CEP का उपयोग किया जाता है।

यदि आप खाली सामग्री के साथ स्थिति वापस करना चाहते हैं, तो आपको इसे एक खाली प्रतिक्रिया के रूप में माना जाएगा और CEP दिखाया जाएगा, इसलिए इस कोड को बेहतर बनाने के लिए कुछ जगह है।


0

डिफ़ॉल्ट रूप से IIS 7 विस्तृत कस्टम त्रुटि संदेशों का उपयोग करता है इसलिए मुझे लगता है कि Response.StatusCode 404 के बजाय 404.XX के बराबर होगा।

आप IIS7 को सरल त्रुटि संदेश कोड का उपयोग करने के लिए कॉन्फ़िगर कर सकते हैं या अपने कोड को संशोधित करके अधिक विस्तृत त्रुटि संदेश जो IIS7 प्रदान करते हैं।

अधिक जानकारी यहाँ उपलब्ध है: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-en enable-custom-error-pages.aspx

आगे की जांच से पता चला कि मेरे पास यह गलत तरीका था - विस्तृत संदेश डिफ़ॉल्ट रूप से नहीं हैं, लेकिन शायद वे आपके बॉक्स पर, यदि आपने उल्लेख किया है तो अलग-अलग त्रुटि संदेश देख रहे हैं।


Response.StatusCode एक पूर्णांक है, इसलिए मुझे केवल "404" की तुलना में अधिक विशिष्ट कोड सेट करने का तरीका नहीं दिखता है। मैंने IIS7 को कस्टम त्रुटि पृष्ठों का उपयोग / दिखाने के लिए कॉन्फ़िगर किया है, जैसे आपका URL इंगित करता है।
निकोलस

हम्म ... दुर्भाग्य से मैं इस समय परीक्षण नहीं कर सकता क्योंकि मैं अपने होम पीसी पर नहीं हूं। यदि आपके पास तब तक कोई समाधान नहीं है - मेरे पास आज रात एक नज़र होगा।
nullnvoid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.