2016-11-01 14 views
11

Chociaż ustawienie MaxRequestLength i maxAllowedContentLength na maksymalne możliwe wartości w sekcji web.config, ASP.Net Core nie zezwala na przesyłanie plików większych niż 134,217,728 Bytes. Dokładny błąd pochodzący z serwera WWW to:Limit długości korpusu przekraczał wyjątek

Wystąpił nieobsługiwany wyjątek podczas przetwarzania żądania.

InvalidDataException: Przekroczono limit długości korpusu wieloczęściowego 134217728.

Czy można to obejść? (ASP.Net Core)

+0

Czy możesz opublikować ślad stosu wyjątków? –

+0

@aguafrommars: Już rozwiązałem ten problem, sprawdź moją własną odpowiedź. – Transcendent

Odpowiedz

29

Znalazłem rozwiązanie tego problemu po przeczytaniu niektórych postów w GitHub. Wniosek jest taki, że muszą one zostać ustawione w klasie Startup. Na przykład:

public void ConfigureServices(IServiceCollection services) 
{ 
     services.AddMvc(); 
     services.Configure<FormOptions>(x => { 
      x.ValueLengthLimit = int.MaxValue; 
      x.MultipartBodyLengthLimit = int.MaxValue; // In case of multipart 
     }) 
} 

To rozwiąże problem. Jednak wskazano również, że istnieje atrybut [RequestFormSizeLimit], ale nie udało mi się go jeszcze ustalić.

+0

Nie sądzę, że ustawienie limitów w web.config ma jakikolwiek wpływ w aplikacji ASP.NET Core. – Pawel

+3

Dzięki Bogu, znalazłem Cię, zagubiłem się bez Ciebie – daniherculano

+1

Ktoś inny ma problemy z uruchomieniem tego w najnowszych wersjach? –

0

w przypadku ktoś jeszcze zmierzyć się z tym problemem Utworzyłem middle-ware który przechwycenia żądania i tworzyć kolejne ciało

public class FileStreamUploadMiddleware { 
    private readonly RequestDelegate _next; 

public FileStreamUploadMiddleware(RequestDelegate next) 
{ 
    _next = next; 
} 

public async Task Invoke(HttpContext context) 
{ 
    if (context.Request.ContentType != null) 
    { 
    if (context.Request.Headers.Any(x => x.Key == "Content-Disposition")) 
    { 
     ContentDispositionHeaderValue v = ContentDispositionHeaderValue.Parse(context.Request.Headers.First(x => x.Key == "Content-Disposition").Value); 
     if (HasFileContentDisposition(v)) 
     { 

     var memoryStream = new MemoryStream(); 
     context.Request.Body.CopyTo(memoryStream); 
     var length = memoryStream.Length; 
     var formCollection = context.Request.Form = 
      new FormCollection(new Dictionary<string, StringValues>(), 
      new FormFileCollection() { new FormFile(memoryStream, 0, length, v.Name, v.FileName) }); 



     } 

    } 

    } 

    await _next.Invoke(context); 
} 

#region Helper 

public static bool HasFileContentDisposition(ContentDispositionHeaderValue contentDisposition) 
{ 
    // this part of code from https://github.com/aspnet/Mvc/issues/7019#issuecomment-341626892 
    return contentDisposition != null 
     && contentDisposition.DispositionType.Equals("form-data") 
     && (!string.IsNullOrEmpty(contentDisposition.FileName) 
      || !string.IsNullOrEmpty(contentDisposition.FileNameStar)); 
} 
#endregion 
} 

iw sterowniku możemy pobierać pliki tworzenia żądania

[HttpPost("/api/file")] 
public IActionResult GetFile([FromServices] IHttpContextAccessor contextAccessor, [FromServices] IHostingEnvironment environment) 
{ 
    //save the file 
    var files = Request.Form.Files; 
    foreach (var file in files) 
    { 
    var memoryStream = new MemoryStream(); 
    file.CopyTo(memoryStream); 

    var fileStream = global::System.IO.File.Create($"{environment.WebRootPath}/images/background/{file.FileName}", (int)file.Length, FileOptions.None); 
    fileStream.Write(memoryStream.ToArray(), 0, (int)file.Length); 

    fileStream.Flush(); 
    fileStream.Dispose(); 

    memoryStream.Flush(); 
    memoryStream.Dispose(); 
    } 
    return Ok(); 
    } 

możesz ulepszyć kod do swoich potrzeb, np .: dodaj parametry formularza w treści żądania i przekształć go w deserializację.

jest to obejście, ale to działa.

Powiązane problemy