75 votes

Augmenter la taille du fichier à télécharger dans Asp.Net core

Actuellement, je travaille avec Asp.Net Core et MVC6 et j'ai besoin de télécharger des fichiers de taille illimitée. J'ai cherché sa solution mais je n'ai toujours pas obtenu de réponse réelle.

J'ai essayé ce lien

Si quelqu'un a une idée, merci de l'aider.

Merci.

75voto

Matt Points 602

Les autres réponses résolvent la restriction IIS . Cependant, à partir de ASP.NET Core 2.0, serveur Kestrel impose également ses propres limites par défaut.

Github de KestrelServerLimits.cs

Annonce de la limite de taille du corps de la demande et solution (citée ci-dessous)

Instructions MVC

Si vous souhaitez modifier la limite de taille maximale du corps de la requête pour une action ou un contrôleur MVC spécifique, vous pouvez utiliser la commande RequestSizeLimit attribut. Le texte suivant permettrait MyAction pour accepter des corps de requête jusqu'à 100 000 000 d'octets.

[HttpPost]
[RequestSizeLimit(100_000_000)]
public IActionResult MyAction([FromBody] MyViewModel data)
{

[DisableRequestSizeLimit] peut être utilisé pour rendre la taille des requêtes illimitée. Cela rétablit effectivement le comportement pré-2.0.0 pour l'action ou le contrôleur attribué.

Instructions relatives aux intergiciels génériques

Si la demande n'est pas gérée par une action MVC, la limite peut toujours être modifiée pour chaque demande à l'aide de l'attribut IHttpMaxRequestBodySizeFeature . Par exemple :

app.Run(async context =>
{
    context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = 100_000_000;

MaxRequestBodySize est un long nullable. En lui attribuant la valeur null, on désactive la limite comme le fait MVC. [DisableRequestSizeLimit] .

Vous ne pouvez configurer la limite sur une requête que si l'application n'a pas encore commencé la lecture, sinon une exception est levée. Il y a une IsReadOnly qui vous indique si le MaxRequestBodySize est en lecture seule, ce qui signifie qu'il est trop tard pour configurer la limite.

Instructions de configuration globale

Si vous souhaitez modifier la taille maximale du corps de la demande de manière globale, vous pouvez le faire en modifiant l'attribut MaxRequestBodySize dans le rappel de l'un ou l'autre des éléments suivants UseKestrel ou UseHttpSys . MaxRequestBodySize est un long nullable dans les deux cas. Par exemple :

.UseKestrel(options =>
{
    options.Limits.MaxRequestBodySize = null;

ou

.UseHttpSys(options =>
{
    options.MaxRequestBodySize = 100_000_000;

0 votes

Quel est le plus gros fichier que vous ou quelqu'un d'autre a pu télécharger avec succès avec ce système ? Je suis juste curieux car je travaille sur un projet qui nécessitera de gros téléchargements pour des communications sécurisées.

1 votes

J'ai téléchargé des fichiers de 10 Go. Je pense que vous ne seriez limité que par l'atteinte d'un paramètre de délai d'attente maximal du serveur, ou par l'atteinte d'une limite de mémoire/de stockage de fichiers, selon la façon dont vous diffusez/stockez les fichiers.

4 votes

Dans mon cas, le DisableRequestSizeLimit n'était pas suffisant. J'ai dû utiliser l'attribut RequestFormLimits aussi. Comme ceci : [HttpPost("upload"), DisableRequestSizeLimit, RequestFormLimits(MultipartBodyLengthLimit = Int32.MaxValue, ValueLengthLimit = Int32.MaxValue)]

44voto

Ashley Lee Points 2575

Vous obtenez probablement un code d'état HTTP 404.13 lorsque vous téléchargez un fichier de plus de 30 Mo. Si vous exécutez votre application ASP.Net Core dans IIS, le pipeline IIS intercepte votre requête avant qu'elle n'atteigne votre application.

Mettez à jour votre web.config :

<system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
    <!-- Add this section for file size... -->
    <security>
      <requestFiltering>
        <!-- Measured in Bytes -->
        <requestLimits maxAllowedContentLength="1073741824" />  <!-- 1 GB-->
      </requestFiltering>
    </security>
  </system.webServer>

Les applications ASP.Net précédentes nécessitaient également cette section, mais elle n'est plus nécessaire dans Core puisque vos requêtes sont traitées par un intergiciel :

  <system.web>
    <!-- Measured in kilobytes -->
    <httpRuntime maxRequestLength="1048576" />
  </system.web>

1 votes

Vous vouliez probablement dire 30MB, pas GB

7 votes

Si vous copiez/collez aveuglément ce qui précède, <cough> comme je ne le ferais jamais, </cough> n'oubliez pas qu'elle doit être imbriquée dans la section <configuration> élément. blogs.msdn.microsoft.com/azureossds/2016/06/15/

26voto

haiwuxing Points 647

Dans le projet ASP.NET Core 1.1 qui a été créé par Visual Studio 2017, si vous voulez augmenter la taille du fichier de téléchargement. Vous devez créer le fichier web.config par vous-même, et ajouter ces contenus :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <!-- 1 GB -->
        <requestLimits maxAllowedContentLength="1073741824" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

Dans le fichier Startup.cs, ajoutez ces contenus :

public void ConfigureServices(IServiceCollection services)
{
  services.Configure<FormOptions>(x =>
  {
      x.ValueLengthLimit = int.MaxValue;
      x.MultipartBodyLengthLimit = int.MaxValue;
      x.MultipartHeadersLengthLimit = int.MaxValue;
  });

  services.AddMvc();
}

16voto

TanvirArjel Points 4560

Je suis peut-être en retard, mais voici la solution complète pour télécharger un fichier d'une taille supérieure à 30.0 Mo dans ASP.NET Core Version >=2.0 :

Vous devez suivre les trois étapes suivantes :

1. Limite de longueur du contenu de l'IIS

La limite de demande par défaut ( maxAllowedContentLength ) est 30,000,000 octets, ce qui représente environ 28.6 MB . Personnalisez la limite dans le web.config fichier :

<system.webServer>
    <security>
        <requestFiltering>
            <!-- Handle requests up to 1 GB -->
            <requestLimits maxAllowedContentLength="1073741824" />
        </requestFiltering>
    </security>
</system.webServer>

Note : sans cette application fonctionnant sur IIS, elle ne fonctionnerait pas.

2. ASP.NET Core Limitation de la longueur des requêtes

Pour les applications fonctionnant sur IIS :

services.Configure<IISServerOptions>(options =>
{
    options.MaxRequestBodySize = int.MaxValue;
});

Pour une application fonctionnant sur Kestrel :

services.Configure<KestrelServerOptions>(options =>
{
    options.Limits.MaxRequestBodySize = int.MaxValue; // if don't set default value is: 30 MB
});

3. Limite de longueur du corps multipartite du formulaire

services.Configure<FormOptions>(options =>
{
    options.ValueLengthLimit = int.MaxValue;
    options.MultipartBodyLengthLimit = int.MaxValue; // if don't set default value is: 128 MB
    options.MultipartHeadersLengthLimit = int.MaxValue;
});

L'ajout de toutes les options ci-dessus résoudra le problème lié au téléchargement de fichiers d'une taille supérieure à 30,0 Mo.

0 votes

J'ai fait les 3 étapes mentionnées ci-dessus, mais j'ai toujours un problème de CORS. Si vous pouvez ajouter des éléments de débogage, cela aidera quelqu'un. - J'ai juste sauté cette étape services.Configure<IISServerOptions>(options => comme j'utilise web api 2.1 c#

0 votes

Pour Kestrel, j'ai dû mettre services.Configure<KestrelServerOptions>(options => options.Limits.MaxRequestBodySize = <my value>);

15voto

Legends Points 6728

Dans votre startup.cs configurer FormsOptions Fonctionnalité Http :

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<FormOptions>(o =>  // currently all set to max, configure it to your needs!
    {
        o.ValueLengthLimit = int.MaxValue;
        o.MultipartBodyLengthLimit = long.MaxValue; // <-- !!! long.MaxValue
        o.MultipartBoundaryLengthLimit = int.MaxValue;
        o.MultipartHeadersCountLimit = int.MaxValue;
        o.MultipartHeadersLengthLimit = int.MaxValue;
    });
}

Utilisez IHttpMaxRequestBodySizeFeature Fonctionnalité Http à configurer MaxRequestBodySize

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.Use(async (context, next) =>
    {
        context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = null; // unlimited I guess
        await next.Invoke();
    });
}

Kestrel :

public static IHostBuilder CreateHostBuilder(string[] args) =>
                    Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>.UseKestrel(o => o.Limits.MaxRequestBodySize = null);
                    });

IIS --> web.config :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <!-- ~ 2GB -->
    <httpRuntime maxRequestLength="2147483647" /> // kbytes
  </system.web>
  <system.webServer>
    <security>
      <requestFiltering>
        <!-- ~ 4GB -->
        <requestLimits maxAllowedContentLength="4294967295" /> // bytes
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

Http.sys :

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>().UseHttpSys(options =>
            {
                options.MaxRequestBodySize = null;
            });
        });

Si vous voulez télécharger un très gros fichier, potentiellement plusieurs Go, et que vous voulez le mettre en mémoire tampon dans un fichier de type MemoryStream sur le serveur, vous obtiendrez un message d'erreur Stream was too long car la capacité de l MemoryStream est int.MaxValue .

Vous devrez mettre en place votre propre MemoryStream classe. Mais de toute façon, mettre en mémoire tampon de si gros fichiers n'a aucun sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X