Nous souhaitons limiter la taille maximale du fichier de téléchargement sur notre site Web. Nous avons déjà défini les limites appropriées dans notre web.config. Le problème que nous rencontrons est si un vraiment grand fichier (1 Go, par exemple) est téléchargé, le fichier entier est téléchargé avant qu'une erreur côté serveur est générée, et le type de l'erreur est différente si le le fichier est énorme ou pas.Prévention du téléchargement de fichiers volumineux dans ASP.NET 4.0
Existe-t-il un moyen de détecter la taille d'un téléchargement de fichier en attente avant que le téléchargement réel ait lieu?
Voilà mes paramètres web.config pertinents qui limitent les demandes à 16 Mo:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<httpRuntime maxRequestLength="12288"/>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="12582912"/>
</requestFiltering>
</security>
</system.webServer>
</configuration>
J'ai essayé de créer un module HTTP afin que je puisse intercepter une demande au début du cycle de vie de la demande, mais les ajouts semblent lieu avant même l'événement BeginRequest
de HttpApplication
:
public class UploadModule : IHttpModule
{
private const int MaxUploadSize = 12582912;
public void Init(HttpApplication context)
{
context.BeginRequest += handleBeginRequest;
}
public void Dispose()
{
}
private void handleBeginRequest(object sender, EventArgs e)
{
// The upload takes place before this method gets called.
var app = sender as HttpApplication;
if (app.Request.Files.OfType<HttpPostedFile>()
.Any(f => f.ContentLength > MaxUploadSize))
{
app.Response.StatusCode = 413;
app.Response.StatusDescription = "Request Entity Too Large";
app.Response.End();
app.CompleteRequest();
}
}
}
Mise à jour:
Je sais que les technologies côté client comme Flash peuvent détecter les tailles de fichiers avant le téléchargement, mais nous avons besoin d'une solution de contournement côté serveur car nous voulons cibler les plates-formes qui ne supportent pas Flash/Java/ActiveX/Silverlight. Je crois que IIS ou ASP.NET a un bug qui permet de télécharger des fichiers volumineux malgré les limites, donc j'ai déposé un bug here. Une extension ISAPI me donnerait-elle plus de contrôle sur le traitement des requêtes que les modules et les gestionnaires HTTP, par exemple si je pouvais interrompre un téléchargement si l'en-tête Content-Length dépassait la limite autorisée?
Mise à jour 2:
Soupir. Microsoft a fermé le bug que j'ai déposé en tant que doublon, mais n'a fourni aucune information supplémentaire. J'espère qu'ils n'ont pas simplement laissé tomber la balle à ce sujet.
Mise à jour 3:
Hourra! Selon Microsoft:
Ce bogue est en cours de résolution car il a été porté à l'équipe de produit IIS. L'équipe IIS a depuis corrigé le bogue, qui sera inclus dans la future version de Windows.
+1 sur la question; intéressé par ce sujet moi-même. D'après ce que je comprends, vous ne pouvez rien faire avant que toute la demande ne soit présentée, et le code que vous essayez d'utiliser n'a certainement aucun moyen de savoir à l'avance. Je pense qu'il faudrait quelque chose plus tôt dans le pipeline de demandes; comme dans le client, ou avant IIS/ASP.NET reçoit la demande - que la demande commence à diffuser. –
peut être vous pouvez vous référer à cela: http://stackoverflow.com/questions/14032918/setting-maxrequestlength -programmatically/14033087 # 14033087 –