c# पकड़ना "अधिकतम अनुरोध लंबाई पार हो गई"




asp.net httpexception (11)

मैं एक अपलोड फ़ंक्शन लिख रहा हूं, और "System.Web.HttpException: अधिकतम अनुरोध लंबाई पार हो गई है" Web.config में अधिकतम httpRuntime आकार में निर्दिष्ट अधिकतम आकार से अधिकतम फ़ाइलों के साथ (अधिकतम आकार 5120 पर सेट)। मैं फ़ाइल के लिए एक साधारण <input> का उपयोग कर रहा हूँ।

समस्या यह है कि अपलोड बटन के क्लिक-इवेंट से पहले अपवाद फेंक दिया जाता है, और मेरे कोड को चलाने से पहले अपवाद होता है। तो मैं अपवाद को कैसे पकड़ूं और कैसे संभालें?

संपादित करें: अपवाद तुरंत फेंक दिया गया है, इसलिए मुझे पूरा यकीन है कि धीमे कनेक्शन के कारण यह टाइमआउट समस्या नहीं है।


आप अपने web.config में अधिकतम अनुरोध लंबाई बढ़ाकर इसे हल कर सकते हैं:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <httpRuntime maxRequestLength="102400" />
    </system.web>
</configuration>

उपरोक्त उदाहरण 100 एमबी सीमा के लिए है।


यदि आप क्लाइंट साइड सत्यापन चाहते हैं तो आपको अपवाद फेंकने की आवश्यकता कम हो जाएगी, जिसे आप क्लाइंट साइड फ़ाइल आकार सत्यापन को लागू करने का प्रयास कर सकते हैं।

नोट: यह केवल उन ब्राउज़रों में काम करता है जो HTML5 का समर्थन करते हैं। http://www.html5rocks.com/en/tutorials/file/dndfiles/

<form id="FormID" action="post" name="FormID">
    <input id="target" name="target" class="target" type="file" />
</form>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>

<script type="text/javascript" language="javascript">

    $('.target').change(function () {

        if (typeof FileReader !== "undefined") {
            var size = document.getElementById('target').files[0].size;
            // check file size

            if (size > 100000) {

                $(this).val("");

            }
        }

    });

</script>


यहां एक वैकल्पिक तरीका है, जिसमें कोई भी "हैक्स" शामिल नहीं है, लेकिन एएसपी.NET 4.0 या उसके बाद की आवश्यकता है:

//Global.asax
private void Application_Error(object sender, EventArgs e)
{
    var ex = Server.GetLastError();
    var httpException = ex as HttpException ?? ex.InnerException as HttpException;
    if(httpException == null) return;

    if(httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge)
    {
        //handle the error
        Response.Write("Sorry, file is too big"); //show this message for instance
    }
}

टैग के बाद

<security>
     <requestFiltering>
         <requestLimits maxAllowedContentLength="4500000" />
     </requestFiltering>
</security>

निम्नलिखित टैग जोड़ें

 <httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" subStatusCode="13" />
  <error statusCode="404" subStatusCode="13" prefixLanguageFilePath="" path="http://localhost/ErrorPage.aspx" responseMode="Redirect" />
</httpErrors>

आप त्रुटि पृष्ठ पर यूआरएल जोड़ सकते हैं ...


ऐसा करने का एक तरीका है web.config में अधिकतम आकार सेट करना जैसा कि पहले से ही ऊपर बताया गया है उदाहरण के लिए

<system.web>         
    <httpRuntime maxRequestLength="102400" />     
</system.web>

फिर जब आप अपलोड ईवेंट को संभालते हैं, तो आकार की जांच करें और यदि यह एक विशिष्ट राशि से अधिक है, तो आप इसे जाल कर सकते हैं

protected void btnUploadImage_OnClick(object sender, EventArgs e)
{
    if (fil.FileBytes.Length > 51200)
    {
         TextBoxMsg.Text = "file size must be less than 50KB";
    }
}

गेटकिल्लर ने कहा कि आपको maxRequestLength बदलने की जरूरत है। अपलोड की गति बहुत धीमी होने पर आपको निष्पादन टाइमआउट को बदलने की भी आवश्यकता हो सकती है। ध्यान दें कि आप नहीं चाहते हैं कि इनमें से कोई भी सेटिंग बहुत बड़ी हो अन्यथा आप डॉस हमलों के लिए खुले रहेंगे।

निष्पादन के लिए डिफ़ॉल्ट टाइमआउट 360 सेकंड या 6 मिनट है।

आप httpRuntime Element के साथ maxRequestLength और executionTimeout को बदल सकते हैं।

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <httpRuntime maxRequestLength="102400" executionTimeout="1200" />
    </system.web>
</configuration>

संपादित करें:

यदि आप इस पर ध्यान दिए बिना अपवाद को संभालना चाहते हैं तो पहले ही कहा गया है कि आपको इसे Global.asax में संभालना होगा। यहां एक कोड उदाहरण का एक लिंक है।


डेमियन मैकजीर्न द्वारा उल्लिखित हाय समाधान, केवल आईआईएस 6 पर काम करता है,

यह आईआईएस 7 और एएसपी.नेट विकास सर्वर पर काम नहीं करता है। मुझे पृष्ठ प्रदर्शित होता है "404 - फ़ाइल या निर्देशिका नहीं मिली।"

कोई विचार?

संपादित करें:

समझे ... यह समाधान अभी भी एएसपी.नेट विकास सर्वर पर काम नहीं करता है, लेकिन मुझे कारण है कि यह मेरे मामले में आईआईएस 7 पर काम नहीं कर रहा था।

कारण आईआईएस 7 में एक अंतर्निहित अनुरोध स्कैनिंग है जो एक अपलोड फ़ाइल कैप लगाती है जो 30000000 बाइट्स (जो 30 एमबी से थोड़ा कम है) के लिए डिफ़ॉल्ट है।

और मैं डेमियन मैकजीवर द्वारा वर्णित समाधान का परीक्षण करने के लिए आकार 100 एमबी की फाइल अपलोड करने की कोशिश कर रहा था (maxRequestLength = "10240" यानी web.config में 10MB)। अब, अगर मैं आकार> 10 एमबी और <30 एमबी की फ़ाइल अपलोड करता हूं तो पृष्ठ निर्दिष्ट त्रुटि पृष्ठ पर रीडायरेक्ट किया जाता है। लेकिन अगर फ़ाइल का आकार> 30 एमबी है तो यह बदसूरत अंतर्निहित त्रुटि पृष्ठ दिखाता है "404 - फ़ाइल या निर्देशिका नहीं मिली।"

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

appcmd set config "SiteName" -section:requestFiltering -requestLimits.maxAllowedContentLength:209715200 -commitpath:apphost

मैंने अधिकतम सेट किया है। 200 एमबी की सामग्री लंबाई।

इस सेटिंग को करने के बाद, जब मैं 100 एमबी की फाइल अपलोड करने का प्रयास करता हूं तो पृष्ठ को मेरे त्रुटि पृष्ठ पर सफलतापूर्वक रीडायरेक्ट किया जाता है

अधिक जानकारी के लिए, http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx देखें।


दुर्भाग्यवश ऐसे अपवाद को पकड़ने का कोई आसान तरीका नहीं है। मैं जो करता हूं वह पृष्ठ स्तर पर ऑनरर विधि या global.asax में Application_Error को ओवरराइड करता है, फिर जांच करें कि यह अधिकतम अनुरोध विफलता है और यदि ऐसा है, तो किसी त्रुटि पृष्ठ पर स्थानांतरित करें।

protected override void OnError(EventArgs e) .....


private void Application_Error(object sender, EventArgs e)
{
    if (GlobalHelper.IsMaxRequestExceededException(this.Server.GetLastError()))
    {
        this.Server.ClearError();
        this.Server.Transfer("~/error/UploadTooLarge.aspx");
    }
}

यह एक हैक है लेकिन नीचे दिया गया कोड मेरे लिए काम करता है

const int TimedOutExceptionCode = -2147467259;
public static bool IsMaxRequestExceededException(Exception e)
{
    // unhandled errors = caught at global.ascx level
    // http exception = caught at page level

    Exception main;
    var unhandled = e as HttpUnhandledException;

    if (unhandled != null && unhandled.ErrorCode == TimedOutExceptionCode)
    {
        main = unhandled.InnerException;
    }
    else
    {
        main = e;
    }


    var http = main as HttpException;

    if (http != null && http.ErrorCode == TimedOutExceptionCode)
    {
        // hack: no real method of identifying if the error is max request exceeded as 
        // it is treated as a timeout exception
        if (http.StackTrace.Contains("GetEntireRawContent"))
        {
            // MAX REQUEST HAS BEEN EXCEEDED
            return true;
        }
    }

    return false;
}

आईआईएस 7 और उससे आगे में:

web.config फ़ाइल:

<system.webServer>
  <security >
    <requestFiltering>
      <requestLimits maxAllowedContentLength="[Size In Bytes]" />
    </requestFiltering>
  </security>
</system.webServer>

फिर आप कोड को पीछे देख सकते हैं, जैसे:

If FileUpload1.PostedFile.ContentLength > 2097152 Then ' (2097152 = 2 Mb)
  ' Exceeded the 2 Mb limit
  ' Do something
End If

बस सुनिश्चित करें कि web.config में [आकार में बाइट्स] उस फ़ाइल के आकार से अधिक है जिसे आप अपलोड करना चाहते हैं, तो आपको 404 त्रुटि नहीं मिलेगी। फिर आप सामग्री लम्बाई का उपयोग कर कोड में फ़ाइल आकार की जांच कर सकते हैं जो बहुत बेहतर होगा


आप अपने web.config में अधिकतम अनुरोध लंबाई और निष्पादन समय बढ़ाकर इसे हल कर सकते हैं:

कृपया 1200 के बाद ग्रेटर के अधिकतम निष्पादन समय को स्पष्ट करें

<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <httpRuntime maxRequestLength="102400" executionTimeout="1200" /> </system.web> </configuration>

जैसा कि आप शायद जानते हैं, अधिकतम अनुरोध लंबाई दो स्थानों में कॉन्फ़िगर की गई है।

  1. maxRequestLength - ASP.NET ऐप स्तर पर नियंत्रित
  2. maxAllowedContentLength - IIS स्तर पर नियंत्रित <system.webServer> अंतर्गत

पहला मामला इस प्रश्न के अन्य उत्तरों से ढका हुआ है।

दूसरे को पकड़ने के लिए आपको इसे वैश्विक.एक्सएक्स में करने की ज़रूरत है:

protected void Application_EndRequest(object sender, EventArgs e)
{
    //check for the "file is too big" exception if thrown at the IIS level
    if (Response.StatusCode == 404 && Response.SubStatusCode == 13)
    {
        Response.Write("Too big a file"); //just an example
        Response.End();
    }
}




httpexception