Résoudre “longueur Maximale de la demande dépassé” et FileUpload seul chargement

En gros, j'ai eu un ASP.NET contrôle FileUpload, pour qui j'nécessaire pour prendre en compte l'exception levée par le message suivant:

Maximum durée de la demande dépassé.

Les limites que j'ai juste besoin de restreindre l'utilisateur à télécharger un fichier dans tous les parce que j'ai enregistrer les autres détails de certaines zones de texte en DB.

La taille de fichier maximale est définie dans le web.config comme suit:

<system.webServer>
    <security>
        <requestFiltering>
            <requestLimits maxAllowedContentLength="41943040" />
        </requestFiltering>
    </security>
</system.webServer>
<system.web>
    <httpRuntime maxRequestLength="40960" requestValidationMode="2.0" />
</system.web>

Donc j'ai cherché de nombreuses solutions, de nom, puis comme suit:

  1. Utilisation Globale.asax lors de la validation de la taille du fichier en "Application_BeginRequest()", mais il n'a pas résolu mon problème et il se bloque à la Redirection lorsque la taille du fichier est plus grande et une redirection vers une Page d'Erreur n'est pas de travail.

  2. Utilisation de AjaxFileUpload au lieu de ASP.NET contrôle FileUpload, c'est encore se bloque lors de la vérification de la taille du fichier est supérieure à la taille maximale autorisée dans le Web.config.
    Deuxièmement, je dois limiter au total, l'utilisateur peut simplement télécharger un seul fichier, pas plus d'un fichier, en utilisant les AjaxFileUpload il ne travaille pas dans mon état, depuis que j'ai télécharger un document unique et d'enregistrer les autres détails dans certaines zones de texte liées à ce fichier.
    Troisièmement, lorsque la taille du fichier dépasse la limite, c'est à dire 40 MO, puis le AjaxFileUpload devient de couleur rouge, aucun message n'est affiché.

Je veux savoir comment puis-je atteindre mes besoins, car je suis bloqué depuis quelques jours.

Mise à jour: Trouve peu utile, mais ne pourrait pas remplir les exigences de leur base:

Suivant est le balisage:

<asp:Label ID="lblStatus" runat="server" Text=""></asp:Label>
<asp:FileUpload ID="theFile" runat="server" />
<asp:Button ID="Button2" runat="server" Text="Upload 1"  onclick="Button2_Click" />
<asp:Button ID="Button1" runat="server" Text="Upload 1"  onclick="btnUpload1_Click" />
<asp:Button ID="btnUpload" runat="server" Text="btnUpload_Click" onclick="btnUpload_Click" />
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:AjaxFileUpload ID="AjaxFileUpload2" runat="server" ToolTip="Upload File" ThrobberID="MyThrobber" onclientuploaderror="IsFileSizeGreaterThanMax" onuploadcomplete="AjaxFileUpload1_UploadComplete" AllowedFileTypes="jpg,jpeg,gif,png,pjpeg,zip,rar,pdf,xls,xlsx,doc,docx" MaximumNumberOfFiles="1" Height="50px" Width="350px"/>
<asp:Image id="MyThrobber" ImageUrl="~/UploadedFiles/Penguins.jpg" AlternateText="Saving...."  Style="display:None"  Height="1px" Width="350px" runat="server" />

Qui suit est le code C#:

protected void Button2_Click(object sender, EventArgs e)
{
if (theFile.HasFile)
{
HttpRuntimeSection runTime = (HttpRuntimeSection)System.Configuration.ConfigurationManager.GetSection("system.web/httpRuntime");
double maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;
double xxx = theFile.PostedFile.ContentLength;
double ck = xxx / 1024 / 1024;
bool f = false;
if (ck > maxRequestLength)
{
f = true;
}
lblStatus.Text = xxx.ToString() + " " + (f ? "too big" : "size ok");
}
}
protected void btnUpload1_Click(object sender, EventArgs e)
{
try
{
if ((theFile.PostedFile != null) && (theFile.PostedFile.FileName != ""))
{
if ((theFile.PostedFile != null) && (theFile.PostedFile.FileName != ""))
{
fileName = theFile.PostedFile.FileName;
Session["FileAttached"] = fileName;
}
else
{
Session["FileAttached"] = "";
lblStatus.Focus();
lblStatus.ForeColor = System.Drawing.Color.Red;
lblStatus.Text += "<br/>Attachment file not found.";
return;
}
if (fileName != "")
{
cFilePath = Path.GetFileName(fileName);
/*UpPath = "../UploadedFiles";
fullPath = Server.MapPath(UpPath);
fileNpath = fullPath + "\\" + cFilePath;*/
if (theFile.HasFile)
{
string CompletePath = "D:\\Visual Studio 2010\\DevLearnings\\FileAttachSizeMax\\UploadedFiles\\";
if (theFile.PostedFile.ContentLength > 10485760)
{
lblStatus.Focus();
lblStatus.ForeColor = System.Drawing.Color.Red;
lblStatus.Text += "File size is greater than the maximum limit.";
}
else
{
theFile.SaveAs(@CompletePath + theFile.FileName);
lblStatus.Text = "File Uploaded: " + theFile.FileName;
}
}
else
{
lblStatus.Text = "No File Uploaded.";
}
}
}
}
catch (Exception ex)
{
lblStatus.Focus();
lblStatus.ForeColor = System.Drawing.Color.Red;
lblStatus.Text += "Error occurred while saving Attachment.<br/><b>Error:</b> " + ex.Source.ToString() + "<br/><b>Code:</b>" + ex.Message.ToString();
}
}
protected void AjaxFileUpload1_UploadComplete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
{
HttpRuntimeSection runTime = (HttpRuntimeSection)System.Configuration.ConfigurationManager.GetSection("system.web/httpRuntime");
int maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;
if (e.FileSize <= maxRequestLength)
{
string path = MapPath("~/UploadedFiles/");
string fileName = e.FileName;
AjaxFileUpload2.SaveAs(path + fileName);
}
else
{
lblStatus.Text = "File size exceeds the maximum limit. Please use file size not greater than 40MB. ";
return;
}
}
protected void btnUpload_Click(object sender, EventArgs e)
{
//AsyncFileUpload.SaveAs();
//AjaxFileUpload1.SaveAs();
HttpContext context = ((HttpApplication)sender).Context;
//HttpContext context2 = ((System.Web.UI.WebControls.Button)sender).Context;
HttpRuntimeSection runTime = (HttpRuntimeSection)System.Configuration.ConfigurationManager.GetSection("system.web/httpRuntime");
double maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;
if (context.Request.ContentLength > maxRequestLength)
{
IServiceProvider provider = (IServiceProvider)context;
HttpWorkerRequest wr = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
FileStream fs = null;
//Check if body contains data
if (wr.HasEntityBody())
{
//get the total body length
int requestLength = wr.GetTotalEntityBodyLength();
//Get the initial bytes loaded
int initialBytes = wr.GetPreloadedEntityBody().Length;
if (!wr.IsEntireEntityBodyIsPreloaded())
{
byte[] buffer = new byte[512000];
string[] fileName = context.Request.QueryString["fileName"].Split(new char[] { '\\' });
fs = new FileStream(context.Server.MapPath("~/UploadedFiles/" + fileName[fileName.Length - 1]), FileMode.CreateNew);
//Set the received bytes to initial bytes before start reading
int receivedBytes = initialBytes;
while (requestLength - receivedBytes >= initialBytes)
{
//Read another set of bytes
initialBytes = wr.ReadEntityBody(buffer, buffer.Length);
//Write the chunks to the physical file
fs.Write(buffer, 0, buffer.Length);
//Update the received bytes
receivedBytes += initialBytes;
}
initialBytes = wr.ReadEntityBody(buffer, requestLength - receivedBytes);
}
}
fs.Flush();
fs.Close();
context.Response.Redirect("About.aspx");
}
}

En dehors de ce qui précède, je suis arrivé à une solution mentionnée ci-dessous.

J'ai utilisé le code suivant, mais il est maintenant en cours d'exécution de la Application_Error() section de Code, mais le problème est qu'il n'est pas de la rediriger vers le Sujet.page aspx.

J'ai essayé de rediriger vers Hotmail.com mais qui n'a pas trop de travail, et aucune exception n'est levée.

Veuillez trouver ci-dessous le code de l'article:

private void Application_Error(object sender, EventArgs e) 
{ 
//Code that runs when an unhandled error occurs
Exception exc = Server.GetLastError();
try
{
if (exc.Message.Contains("Maximum request length exceeded"))
{
//Response.Redirect("~/About.aspx", false);
Response.Redirect("http://www.example.com", false);
}
if (exc.InnerException.Message.Contains("Maximum request length exceeded"))
{
Response.Redirect("http://www.HOTMAIL.com", false);
}
}
catch (Exception ex)
{
}
}

OriginalL'auteur Muzaffar Ali Rana | 2013-02-20