"সর্বাধিক অনুরোধের দৈর্ঘ্য ছাড়িয়ে গেছে"


112

আমি একটি আপলোড ফাংশন লিখছি, এবং "সিস্টেম.ওয়েব.হট্টপ্যাক্সেশন: সমস্যাটির সর্বাধিক অনুরোধের দৈর্ঘ্য অতিক্রম করেছে" ওয়েবকনফাইগ httpRuntime(সর্বাধিক আকারে 5120 এ সেট করা) থেকে সর্বাধিক ফাইলের চেয়ে বড় ফাইলগুলি । আমি <input>ফাইলটির জন্য একটি সাধারণ ব্যবহার করছি ।

সমস্যাটি হ'ল ব্যতিক্রমগুলি আপলোড বোতামটির ক্লিক-ইভেন্টের আগে ছুঁড়ে দেওয়া হয় এবং আমার কোড চালানোর আগে ব্যতিক্রম ঘটে happens তাহলে আমি কীভাবে ব্যতিক্রমটি ধরব এবং পরিচালনা করব?

সম্পাদনা: ব্যতিক্রমটি তাত্ক্ষণিকভাবে নিক্ষেপ করা হয়েছে, সুতরাং আমি নিশ্চিত যে ধীর সংযোগের কারণে এটি কোনও সময়সীমা নয়।


5
কেউ এমভিসি দিয়ে এটি চেষ্টা করেছিল? আমি ব্যতিক্রমটিকে সঠিক উপায়ে ধরতে সক্ষম বলে মনে হচ্ছে, তবে আমি এটি আটকাতে পারছি না: প্রতিবার আমি যখন ত্রুটি পৃষ্ঠাটি রেন্ডার করার চেষ্টা করি তখন একই ব্যতিক্রম ঘটে।
অ্যান্ডি

এই ত্রুটি বার্তাটি আইআইএস দ্বারা নিয়ন্ত্রকের কাছে পৌঁছানোর আগে নিক্ষেপ করা হয়। ফাইলটি সর্বাধিক আপলোড সীমা (আপনার ওয়েব-কনফিগারেশনে সেট করা) অতিক্রম করেছে তা ব্যবহারকারীকে জানানোর জন্য, আপনি সরাসরি কোনও জালিয়াতির ইভেন্টের সাথে জেএসের মাধ্যমে ফাইলের আকারটি বৈধ করতে পারবেন। উদাহরণস্বরূপ <input type="file" id="upload" name="upload" onchange="showFileSize();" />ভিতরে showFileSize(), আপনি var input = document.getElementById("upload"); var file = input.files[0];এইচটিএমএল ট্যাগের মাধ্যমে আপনার ফাইলের আকারের উপর ভিত্তি করে একটি ত্রুটি বার্তা প্রদর্শন করতে পারেন ।
আলফ্রেড ওয়ালেস

উত্তর:


97

দুর্ভাগ্যক্রমে এ জাতীয় ব্যতিক্রম ধরার সহজ উপায় নেই। আমি যা করি তা হয় পৃষ্ঠার স্তরে অনারার পদ্ধতি বা গ্লোবাল.অ্যাসাক্সের অ্যাপ্লিকেশন_স্রোতকে ওভাররাইড করা হয়, তবে এটি সর্বাধিক অনুরোধে ব্যর্থ হয়েছে কিনা তা পরীক্ষা করে দেখুন এবং যদি তাই হয় তবে একটি ত্রুটি পৃষ্ঠায় স্থানান্তরিত করুন।

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
ধন্যবাদ। অনারার কাজ করেনি, তবে অ্যাপ্লিকেশন_এরর কাজ করেছে। আমাদের কাছে এটির জন্য আসলে একটি হ্যান্ডলার রয়েছে, তবে কেউ কোডে এটি বন্ধ করে দিয়েছিল।
মার্কাস এল

এমনকি দু'বছর আগেও, তবে আমি এখনও জিজ্ঞাসা করতে চাই যে এটি এখনও অবধি কার্যকর হয়েছে কিনা? 'গেটইন্ট্রিআরকন্টেন্ট'-এর স্ট্রিং তুলনা কি ঠিক কাজ করে? আমি মনে করি না এটি একটি সময়সীমা প্রসঙ্গ। কেউ কি আমাকে কোথাও এই সম্পর্কে বেআইনীভাবে নির্দেশ করার জন্য দাঁড়িয়ে আছেন?
ইলাইন

@ ইলাইন হ্যাঁ এই কৌশলটি এখনও এএসপি.নেট 4.0 এর সাথে কাজ করে। যদি আপনি এমন একটি অনুরোধ আপলোড করার চেষ্টা করেন যা সর্বাধিক অনুরোধ দৈর্ঘ্যের এএসপি-র চেয়ে বড়। টাইমআউট কোডের সাহায্যে একটি HTTPException নিক্ষেপ করে। রিফ্লেক্টর ব্যবহার করে System.Web.HttpRequest.GetEntireRawContent () এ দেখুন।
ড্যামিয়েন ম্যাকগাইভার

12
@ সাম-রুয়েবি আমি কোনও স্ট্রিং ত্রুটির বার্তায় উত্তর দিতে চাইনি যা স্থানীয়করণের কারণে পরিবর্তিত হতে পারে।
ড্যামিয়েন ম্যাকগাইভার

4
.NET 4.0 এর জন্য এবং পরে সর্বাধিক অনুরোধের আকারটি অতিক্রম করা হয়েছে কিনা তা সনাক্ত করার আরও ভাল উপায় রয়েছে। আপনি এই শর্তটি এইচটিপিএক্সসেপ্টের জন্য পরীক্ষা করতে পারেন: httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge- System.Web.Mageagement.WebEventCodes ব্যবহার করে
Mco

58

গেটকিলার যেমনটি বলেছিলেন আপনাকে ম্যাক্সেউকয়েস্টলেন্টটি পরিবর্তন করতে হবে। আপলোডের গতি খুব কম হলে আপনার এক্সিকিউশনটাইম পরিবর্তন করতেও পারে। নোট করুন যে আপনি এই সেটিংসগুলির মধ্যে একটিও খুব বেশি বড় হতে চান না অন্যথায় আপনি ডস আক্রমণে মুক্ত হবেন।

এক্সিকিউশনটাইমআউটটির ডিফল্টটি 360 সেকেন্ড বা 6 মিনিট।

আপনি httpRun টাইম এলিমেন্টের সাহায্যে ম্যাক্সরেক্সেস্টলেন্ট এবং এক্সিকিউশনটাইমআউট পরিবর্তন করতে পারেন ।

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

সম্পাদনা করুন:

যদি আপনি নির্বিশেষে ব্যতিক্রমটি পরিচালনা করতে চান তবে ইতিমধ্যে বলা হয়েছে যে আপনি এটি Global.asax এ পরিচালনা করতে হবে। এখানে একটি কোড উদাহরণের একটি লিঙ্ক ।


2
আপনার জবাবের জন্য ধন্যবাদ, তবে আমি জিকে এর উত্তরে আমার মন্তব্যে যেমন বলেছিলাম এটি সত্যিই আমার সমস্যার সমাধান করে না। ব্যতিক্রম তাত্ক্ষণিকভাবে ছুঁড়ে ফেলা হিসাবে এটি কোনও সময়সীমা সংক্রান্ত সমস্যা নয়। আরও পরিষ্কার করার জন্য আমি প্রশ্নটি সম্পাদনা করব।
মার্কাস এল

4
কোড উদাহরণ ইউআরএল এমন কোনও পৃষ্ঠায় নির্দেশ করে যা উপলভ্য নয় ... কেউ কি এটি ঠিক করতে পারেন?

20

আপনি আপনার ওয়েব.কমফিগের সর্বাধিক অনুরোধের দৈর্ঘ্য বাড়িয়ে এটি সমাধান করতে পারেন:

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

উপরের উদাহরণটি 100Mb সীমাতে।


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

ড্যামিয়েন ম্যাকগাইভার দ্বারা উল্লিখিত হাই সমাধান, কেবলমাত্র আইআইএস 6-এ কাজ করে,

এটি IIS7 এবং ASP.NET বিকাশ সার্ভারে কাজ করে না। আমি পৃষ্ঠাটি 4040 - ফাইল বা ডিরেক্টরি খুঁজে পাইনি page

কোন ধারনা?

সম্পাদনা করুন:

বুঝেছি ... এই সমাধানটি এখনও এএসপি.নেট ডেভলপমেন্ট সার্ভারে কাজ করে না, তবে আমার ক্ষেত্রে এটি আইআইএস 7 এ কাজ না করার কারণটি পেয়েছি।

কারণটি হ'ল আইআইএস এর বিল্ট-ইন রিকুয়েস্ট স্ক্যানিং রয়েছে যা একটি আপলোড ফাইল ক্যাপ চাপায় যা ডিফল্ট 30000000 বাইট (যা কিছুটা 30MB এর চেয়ে কম)।

এবং আমি ড্যামিয়েন ম্যাকগিভার্ন দ্বারা উল্লিখিত সমাধানটি পরীক্ষা করার জন্য 100 এমবি আকারের ফাইল আপলোড করার চেষ্টা করছিলাম (ম্যাক্সরেক্সটেলেন্থ = "10240" অর্থাত্ ওয়েবকনফিগে 10 এমবি)। এখন, আমি যদি আকার> 10 এমবি এবং <30 এমবি ফাইলটি আপলোড করি তবে পৃষ্ঠাটি নির্দিষ্ট ত্রুটি পৃষ্ঠায় পুনঃনির্দেশ করা হবে। তবে যদি ফাইলের আকার> 30MB হয় তবে এটি "404 - ফাইল বা ডিরেক্টরি খুঁজে পাওয়া যায় নি" প্রদর্শন করতে কুৎসিত অন্তর্নির্মিত ত্রুটি পৃষ্ঠাটি দেখায়।

সুতরাং, এড়াতে, আপনাকে সর্বোচ্চটি বাড়াতে হবে। আইআইএস in এ আপনার ওয়েবসাইটের জন্য অনুরোধের সামগ্রীর দৈর্ঘ্যের অনুমতি দেওয়া। এটি নিম্নলিখিত কমান্ড ব্যবহার করে করা যেতে পারে,

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 দেখুন।
slaphappy

7

এখানে একটি বিকল্প উপায় রয়েছে, এতে কোনও "হ্যাক" জড়িত না, তবে এটিএসপি নেট নেট 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

এটি করার একটি উপায় হ'ল ওয়েবকনফিগের সর্বাধিক আকার নির্ধারণ করা যেমন উপরে ইতিমধ্যে উল্লিখিত হয়েছে

<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

আইআইএস 7 এবং এর বাইরে:

ওয়েবকনফিগ ফাইল:

<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

কেবলমাত্র নিশ্চিত হয়ে নিন যে ওয়েবকনফাইগের [আকারে বাইটস] আপনি যে ফাইলটি আপলোড করতে চান তার চেয়ে বড় কিনা তবে আপনি 404 ত্রুটি পাবেন না। এরপরে আপনি ContentLength ব্যবহারের পিছনে কোডের মধ্যে ফাইলের আকারটি চেক করতে পারেন যা আরও ভাল


2

আপনি সম্ভবত জানেন যে, সর্বোচ্চ অনুরোধ দৈর্ঘ্য TWO জায়গায় কনফিগার করা আছে ।

  1. maxRequestLength - এএসপি.এনইটি অ্যাপ স্তরে নিয়ন্ত্রিত
  2. maxAllowedContentLength- <system.webServer>আইআইএস স্তরে নিয়ন্ত্রিত controlled

প্রথম মামলাটি এই প্রশ্নের অন্যান্য উত্তরের দ্বারা আচ্ছাদিত।

দ্বিতীয় একটিকে ধরতে আপনাকে গ্লোবাল.এক্স্যাক্সে এটি করতে হবে:

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

এন্ডরেকোয়েস্ট ইভেন্টে এটি কীভাবে ধরা?

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;

            }
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.