iis 7 IIS7 में मैं अधिकतम कहां और अधिकतम संभाल कर सकता हूँ?




iis-7 web-config (2)

मेरे पास एएसपीएक्स पेज है जहां मैं किसी उपयोगकर्ता को एक फाइल अपलोड करने की अनुमति दे रहा हूं और मैं अधिकतम फ़ाइल अपलोड आकार को 10 एमबी तक कैप करना चाहता हूं। IIS7, .NET 3.5। मेरे वेब .config फ़ाइल में निम्नलिखित कॉन्फ़िगर किया गया है:

<location path="foo.aspx">
    <system.web>
        <!-- maxRequestLength: kbytes, executionTimeout:seconds -->
        <httpRuntime maxRequestLength="10240" executionTimeout="120" />
        <authorization>
            <allow roles="customRole"/>
            <!-- Deny everyone else -->
            <deny users="*"/>
        </authorization>
    </system.web>
    <system.webServer>
        <security>
            <requestFiltering>
                <!-- maxAllowedContentLength: bytes -->
                <requestLimits maxAllowedContentLength="10240000"/>
            </requestFiltering>
        </security>
        <handlers accessPolicy="Read, Script">
            <add name="foo" path="foo.aspx" verb="POST"
               type="System.Web.UI.PageHandlerFactory"
               preCondition="integratedMode" />
        </handlers>       
    </system.webServer>
</location>

मेरे पास एक कस्टम त्रुटि हैंडलिंग मॉड्यूल है जो IHttpModule लागू IHttpModule । मैंने पाया है कि जब maxRequestLength पार हो गई है, तो HttpApplication.Error वास्तव में उठाया जाता है। हालांकि जब मैं HttpApplication.Error साथ खेलता हूं, तो HttpApplication.Error इवेंट को उठाया नहीं जा रहा है और उपयोगकर्ता को 404.13 पृष्ठ पर रीडायरेक्ट किया जाता है। मैंने दृश्य स्टूडियो के साथ संलग्न किया है, पहले मौका अपवादों को चालू करने पर कुछ भी नहीं फेंक दिया जा रहा है

मेरा पहला विचार है कि पिछली घटना में हेडर की सामग्री की लंबाई की जांच करना है - क्या यह सिफारिशें / सर्वोत्तम अभ्यास हैं जहां मैं ऐसा करता हूं? PostLogRequest? EndRequest?


सबसे सरल तरीका यह है कि पृष्ठ की स्वयं की ओनर विधि में इसे संभालना है

मुझे लगता है कि यह .NET 4.0 में ही काम करता है, क्योंकि WebEventCode गुण को .NET 4.0 में नई रूप में प्रलेखित किया गया है।

protected override void OnError(EventArgs e)
{
    Exception err = Server.GetLastError();
    if (err is HttpException)
    {
        if ((err as HttpException).WebEventCode == 3004)
        {
            Context.Items["error"] = "File exceeded maximum allowed length.";
            Server.Transfer( Context.Request.Url.LocalPath );
            return;
        }
    }
    base.OnError(e);
}

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    if (!IsPostBack)
    {
        string error = Context.Items["error"] as string;
        if (!string.IsNullOrEmpty( error ))
            showErrorMessage( error );
    }
}

मैंने क्या किया था:

  • Server.GetLastError के साथ अंतिम त्रुटि प्राप्त करें
  • जांच लें कि यह "अधिकतम अनुरोध लंबाई पार हो गई है।" त्रुटि (WebEventCode == 3004)
  • एक मान के रूप में अनुरोध को ध्वजांकित करने के लिए संदर्भ के लिए एक मूल्य जोड़ा
  • अनुरोध सर्वर के साथ ही वापस पृष्ठ पर स्थानांतरित करें। ट्रांस्फर (संदर्भ। अनुरोध। यूआरएल.लोकलपाथ)
  • पेज की ऑनलोड विधि त्रुटि फ्लैग के लिए जांचता है और यदि वर्तमान संदेश प्रदर्शित करता है

यह सुनिश्चित करता है कि त्रुटि को पूरी तरह से अनुरोधित पृष्ठ पर नियंत्रित किया जाता है, और पृष्ठ त्रुटियों को रिपोर्ट करने में सक्षम है।

यह भी ध्यान रखें कि ब्राउज़र को अंततः एक उचित प्रतिक्रिया प्राप्त होगी, ब्राउज़र ब्राउज़र के पूरे अनुरोध को अपलोड करने से पहले सर्वर की प्रतिक्रिया को संभालता है और इसे प्रदर्शित करता है इस व्यवहार को संभवतः HTTP प्रोटोकॉल में सर्वर / ब्राउज़र इंटरैक्शन के भाग के रूप में परिभाषित किया गया है, इसलिए संभवतः उस बारे में बहुत कुछ नहीं किया जा सकता है


आईआईएस 7.0 के लिए एएसपी.नेट एप्लीकेशन लाइफ साइकल अवलोकन के लिए और अपना खुद का प्रयोग करने के बाद, मैं यह मान रहा हूं कि किसी भी घटना की बढ़ोतरी से पहले आईआईएस द्वारा अनुरोध सत्यापन किया जाता है।

ऐसा लगता है कि केवल इस त्रुटि के साथ आंतरिक सत्यापन के बाद ही LogRequest, PostLogRequest, EndRequest, PreSendRequestContent, और PreSendRequestHeaders उठाया जाता है।

मैंने अपने कस्टम त्रुटि हैंडलर में HttpApplication.EndRequest घटना के लिए एक ईवेंट हैंडलर संलग्न करने का निर्णय लिया है और POST पर 404.13 स्थिति कोड की जांच करें और इसे संभाल करने की आवश्यकता के अनुसार संभाल लें, जो मेरे मामले में कॉलिंग पृष्ठ पर रीडायरेक्ट करना है जो Server.GetLastError() जांच करेगा। Server.GetLastError() और अंत उपयोगकर्ता के लिए एक दोस्ताना त्रुटि प्रदर्शित करें।

private void application_EndRequest(object sender, EventArgs e)
{
    HttpRequest request = HttpContext.Current.Request;
    HttpResponse response = HttpContext.Current.Response;

    if ((request.HttpMethod == "POST") &&
        (response.StatusCode == 404 && response.SubStatusCode == 13))
    {
        // Clear the response header but do not clear errors and
        // transfer back to requesting page to handle error
        response.ClearHeaders();
        HttpContext.Current.Server.Transfer(
            request.AppRelativeCurrentExecutionFilePath);
    }
}

मैं इस दृष्टिकोण और विकल्प पर प्रतिक्रिया का स्वागत करता हूं





httpapplication