"अधिकतम अनुरोध की लंबाई पार हो गई"


112

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

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

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


5
किसी ने MVC के साथ यह कोशिश की? मैं सही तरीके से अपवाद को पकड़ने में सक्षम हो सकता हूं, लेकिन मैं इसे रोकने में असमर्थ हूं: हर बार जब मैं त्रुटि पृष्ठ को प्रस्तुत करने का प्रयास करता हूं तो वही अपवाद होता है।
एंडी

यह त्रुटि संदेश IIS द्वारा नियंत्रक तक पहुंचने से पहले फेंका जाता है। उपयोगकर्ता को यह सूचित करने के लिए कि फ़ाइल अधिकतम अपलोड सीमा (आपके वेब-कॉन्फ़िगरेशन में सेट) से अधिक है, आप सीधे ऑनस्कॉफ़्ट घटना के साथ जेएस के माध्यम से फ़ाइल आकार को मान्य कर सकते हैं। उदाहरण के लिए <input type="file" id="upload" name="upload" onchange="showFileSize();" />अंदर showFileSize(), आप var input = document.getElementById("upload"); var file = input.files[0];एक HTML टैग के माध्यम से अपनी फ़ाइल के आकार के आधार पर एक त्रुटि संदेश प्रदर्शित कर सकते हैं ।
अल्फ्रेड वालेस

जवाबों:


97

दुर्भाग्य से ऐसे अपवाद को पकड़ने का कोई आसान तरीका नहीं है। मैं जो भी करता हूं वह पृष्ठ स्तर पर OnError विधि या 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;
}

2
धन्यवाद। OnError ने काम नहीं किया, लेकिन Application_Error ने किया। हमारे पास वास्तव में इसके लिए एक हैंडलर है, लेकिन किसी ने कोड में इसे बंद कर दिया था।
मार्कस एल

दो साल पहले भी, लेकिन मैं अभी भी पूछना चाहता हूं कि क्या यह अब तक ठीक काम करता है? 'GetEntireRawContent' की स्ट्रिंग तुलना ठीक काम करती है? मुझे नहीं लगता कि यह कोई टाइमआउट मुद्दा है। क्या कोई है जो मुझे इस बारे में कहीं अशुद्ध बताने के लिए खड़ा है?
ऐलेन

@ ईलाइन हाँ, यह तकनीक अभी भी ASP.Net 4.0 के साथ काम करती है। यदि आप एक अनुरोध अपलोड करने का प्रयास करते हैं जो कि अधिकतम अनुरोध की लंबाई से अधिक है ASP.Net टाइमआउट कोड के साथ एक HttpException फेंकता है। System.Web.HttpRequest.GetEntireRawContent () परावर्तक का उपयोग करके एक नज़र रखें।
डेमियन मैकगिवर्न

12
@ सैम-रूबी मैं एक स्ट्रिंग त्रुटि संदेश पर जवाब नहीं देना चाहता था जो स्थानीयकरण के कारण बदल सकता था।
डेमियन मैकगिवर्न

4
.NET 4.0 के लिए और बाद में पहचानने का बेहतर तरीका है कि अधिकतम अनुरोध आकार को पार कर गया या नहीं। आप इस शर्त को HttpException: httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge- System.Web.Management.WebEventCodes का उपयोग करके चेक कर सकते हैं
mco

58

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

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

आप httpRuntime तत्व के साथ maxRequestLength और निष्पादन समय बदल सकते हैं ।

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

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

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


2
आपके उत्तर के लिए धन्यवाद, लेकिन जैसा कि मैंने जीके के जवाब में अपनी टिप्पणी में कहा था कि यह वास्तव में मेरी समस्या का समाधान नहीं करता है। यह कोई टाइमआउट समस्या नहीं है, क्योंकि अपवाद को तुरंत फेंक दिया जाता है। मैं इस प्रश्न को और अधिक स्पष्ट करने के लिए संपादित करूँगा।
मार्कस एल

4
कोड उदाहरण एक ऐसे पृष्ठ की ओर इंगित करता है जो उपलब्ध नहीं है ... क्या कोई इसे ठीक कर सकता है?
6

20

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

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

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


18
हां और ना। आप सीमा को और आगे बढ़ाते हैं, लेकिन यह वास्तव में अपवाद को संभालता नहीं है। यदि कोई 101+ एमबी अपलोड करने का प्रयास करता है तो भी आपको वही समस्या मिलेगी। सीमा वास्तव में 5 एमबी होनी चाहिए।
मार्कस एल

10

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

नोट: यह केवल उन ब्राउज़र में काम करता है जो 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>


9

हाय समाधान Damien McGivern द्वारा उल्लिखित, केवल IIS6 पर काम करता है,

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

कोई विचार?

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

समझ गया ... यह समाधान अभी भी ASP.NET डेवलपमेंट सर्वर पर काम नहीं करता है, लेकिन मुझे यह कारण मिला कि यह मेरे मामले में IIS7 पर काम नहीं कर रहा था।

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

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

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

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

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

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

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


माफ़ करना! मैंने एक उत्तर के रूप में अपनी क्वेरी को जोड़ा है, मुझे नहीं पता कि मौजूदा पोस्ट में टिप्पणियों को कैसे जोड़ा जाए।
विनोद टी। पाटिल

1
आपको बस और अधिक प्रतिनिधि चाहिए। पोस्ट टिप्पणी करने के लिए। अपने वर्तमान प्रतिनिधि के साथ आप क्या कर सकते हैं / नहीं कर सकते, इसके बारे में अधिक जानकारी के लिए faq देखें।
थप्पड़ वाला

7

यहां एक वैकल्पिक तरीका है, जिसमें कोई "हैक" शामिल नहीं है, लेकिन इसके लिए ASP.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
    }
}

4

इसका एक तरीका यह है कि 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";
    }
}

1
यह काम नहीं करता है। क्लिक इवेंट कभी ट्रिगर नहीं होता है। अपवाद पहले होता है।
लोम्बास


3

IIS 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 त्रुटि नहीं मिलेगी। तब आप ContentLength का उपयोग करने के पीछे कोड में फ़ाइल का आकार देख सकते हैं जो बहुत बेहतर होगा


2

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

  1. maxRequestLength - ASP.NET ऐप स्तर पर नियंत्रित
  2. maxAllowedContentLength- के तहत <system.webServer>, IIS स्तर पर नियंत्रित

पहला प्रश्न इस प्रश्न के अन्य उत्तरों द्वारा कवर किया गया है।

सेकंड को पकड़ने के लिए आपको Global.asax में ऐसा करने की आवश्यकता है:

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

1

टैग के बाद

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

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


0

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

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

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

0

EndRequest इवेंट में इसे कैसे पकड़ें?

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

0

इसके माध्यम से जाँच की जा सकती है:

        var httpException = ex as HttpException;
        if (httpException != null)
        {
            if (httpException.WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
            {
                // Request too large

                return;

            }
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.