Skip to content

Commit f87686d

Browse files
Fix error System.IO.InvalidDataException: Multipart body length limit (#617)
* Fix error System.IO.InvalidDataException: Multipart body length limit 134217728 exceeded making that limit configurable and with a default of 500MB instead of 128MB * Adjust DEFAULT_MAX_FILE_UPLOAD_SIZE_BYTES to 528MB * Settings read at Startup were not using the standard mechanism of Config which considers the environment variables overriding values defined at appsettings.json as reviewed by @ggallotti (cherry picked from commit 4535465)
1 parent b2603cb commit f87686d

File tree

2 files changed

+17
-17
lines changed

2 files changed

+17
-17
lines changed

dotnet/src/dotnetcore/GxClasses.Web/Middleware/HandlerFactory.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class AppSettings
2020
public BaseUrls BaseUrls { get; set; }
2121
public bool AnalyticsEnabled { get; set; }
2222
public int SessionTimeout { get; set; }
23+
public int MaxFileUploadSize { get; set; }
2324
}
2425

2526
public class BaseUrls
@@ -32,7 +33,6 @@ public class BaseUrls
3233
public class HandlerFactory
3334
{
3435
private static readonly ILog log = log4net.LogManager.GetLogger(typeof(GeneXus.HttpHandlerFactory.HandlerFactory));
35-
private readonly AppSettings _appSettings;
3636
private string _basePath;
3737
static Dictionary<string, Type> _aspxObjects = new Dictionary<string, Type>(){
3838
{"gxoauthlogout",typeof(GXOAuthLogout)},
@@ -59,14 +59,13 @@ public class HandlerFactory
5959
private const string QUERYVIEWER_NAMESPACE = "QueryViewer.Services";
6060
private const string GXFLOW_NSPACE = "GXflow.Programs";
6161
private static List<string> GxNamespaces;
62-
public HandlerFactory(RequestDelegate next, IOptions<AppSettings> appSettings)
62+
public HandlerFactory(RequestDelegate next)
6363
{
64-
_appSettings = appSettings.Value;
64+
6565
}
66-
public HandlerFactory(RequestDelegate next, IOptions<AppSettings> appSettings, String basePath)
66+
public HandlerFactory(RequestDelegate next, String basePath)
6767
{
6868
_basePath = basePath;
69-
_appSettings = appSettings.Value;
7069
}
7170

7271

dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
using Microsoft.AspNetCore.DataProtection;
1414
using Microsoft.AspNetCore.Hosting;
1515
using Microsoft.AspNetCore.Http;
16+
using Microsoft.AspNetCore.Http.Features;
1617
using Microsoft.AspNetCore.Mvc;
1718
using Microsoft.AspNetCore.Rewrite;
1819
using Microsoft.AspNetCore.Routing;
1920
using Microsoft.AspNetCore.Server.Kestrel.Core;
2021
using Microsoft.AspNetCore.StaticFiles;
21-
using Microsoft.Extensions.Configuration;
2222
using Microsoft.Extensions.DependencyInjection;
2323
using Microsoft.Extensions.FileProviders;
2424
using Microsoft.Extensions.Logging;
@@ -90,6 +90,7 @@ public class Startup
9090

9191
static readonly ILog log = log4net.LogManager.GetLogger(typeof(Startup));
9292
const int DEFAULT_SESSION_TIMEOUT_MINUTES = 20;
93+
const int DEFAULT_MAX_FILE_UPLOAD_SIZE_BYTES = 528000000;
9394
public static string VirtualPath = string.Empty;
9495
public static string LocalPath = Directory.GetCurrentDirectory();
9596

@@ -107,22 +108,14 @@ public class Startup
107108

108109
public Startup(Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
109110
{
110-
111-
var builder = new ConfigurationBuilder()
112-
.SetBasePath(env.ContentRootPath)
113-
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
114-
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
115-
.AddEnvironmentVariables();
116111
GXRouting.ContentRootPath = env.ContentRootPath;
117112
GXRouting.UrlTemplateControllerWithParms = "controllerWithParms";
118-
Config.ConfigRoot = builder.Build();
119113
GxContext.IsHttpContext = true;
120114
gxRouting = new GXRouting(REST_BASE_URL);
121115
}
122116
public void ConfigureServices(IServiceCollection services)
123117
{
124118
services.AddMvc(option => option.EnableEndpointRouting = false);
125-
services.Configure<AppSettings>(Config.ConfigRoot.GetSection("AppSettings"));
126119
services.Configure<KestrelServerOptions>(options =>
127120
{
128121
options.AllowSynchronousIO = true;
@@ -133,17 +126,25 @@ public void ConfigureServices(IServiceCollection services)
133126
options.AllowSynchronousIO = true;
134127
});
135128
services.AddDistributedMemoryCache();
136-
AppSettings settings = new AppSettings();
137-
Config.ConfigRoot.GetSection("AppSettings").Bind(settings);
138129

130+
services.Configure<FormOptions>(options =>
131+
{
132+
if (Config.GetValueOf("MaxFileUploadSize", out string MaxFileUploadSizeStr) && int.TryParse(MaxFileUploadSizeStr, out int MaxFileUploadSize))
133+
options.MultipartBodyLengthLimit = MaxFileUploadSize;
134+
else
135+
options.MultipartBodyLengthLimit = DEFAULT_MAX_FILE_UPLOAD_SIZE_BYTES;
136+
});
139137
ISessionService sessionService = GXSessionServiceFactory.GetProvider();
140138

141139
if (sessionService != null)
142140
ConfigureSessionService(services, sessionService);
143141
services.AddHttpContextAccessor();
144142
services.AddSession(options =>
145143
{
146-
options.IdleTimeout = TimeSpan.FromMinutes(settings.SessionTimeout==0 ? DEFAULT_SESSION_TIMEOUT_MINUTES : settings.SessionTimeout);
144+
if (Config.GetValueOf("SessionTimeout", out string SessionTimeoutStr) && int.TryParse(SessionTimeoutStr, out int SessionTimeout))
145+
options.IdleTimeout = TimeSpan.FromMinutes(SessionTimeout);
146+
else
147+
options.IdleTimeout = TimeSpan.FromMinutes(DEFAULT_SESSION_TIMEOUT_MINUTES);
147148
options.Cookie.HttpOnly = true;
148149
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
149150
options.Cookie.IsEssential = true;

0 commit comments

Comments
 (0)