Как перенести конфигурации ASP. NET Framework в ASP. NET Core? - PullRequest
0 голосов
/ 13 марта 2020

Я перевожу приложение ASP. NET Framework, размещенное на IIS, на ASP. NET Ядро, размещенное на Kestrel.

В ASP. NET Framework, I у меня есть web.config с десятками пользовательских конфигураций / оптимизаций, таких как:

<httpRuntime executionTimeout="120" maxUrlLength="8192" maxQueryStringLength="8192" />

Проблема в том, что я не могу найти, как настроить эти параметры, например maxQueryStringLength в ASP. NET Ядро с Kestrel.

Например, в этом ответе пользователь говорит, что он недоступен в ASP. NET Core, и рекомендует использовать IIS или NGINX.

Как перенести настройки web.config без использования файла web.config в ASP. NET Core? Я бы предпочел использовать файл по умолчанию appsettings.json.

1 Ответ

2 голосов
/ 13 марта 2020

Вы можете использовать ASP. NET Пределы Core Kestrel для создания соответствующих конфигов

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.server.kestrel.core.kestrelserverlimits?view=aspnetcore-3.1

Это можно сделать через конфиги в Программе .cs

#elif Limits
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    #region snippet_Limits
                    webBuilder.ConfigureKestrel(serverOptions =>
                    {
                        serverOptions.Limits.MaxConcurrentConnections = 100;
                        serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
                        serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
                        serverOptions.Limits.MinRequestBodyDataRate =
                            new MinDataRate(bytesPerSecond: 100, 
                                gracePeriod: TimeSpan.FromSeconds(10));
                        serverOptions.Limits.MinResponseDataRate =
                            new MinDataRate(bytesPerSecond: 100, 
                                gracePeriod: TimeSpan.FromSeconds(10));
                        serverOptions.Listen(IPAddress.Loopback, 5000);
                        serverOptions.Listen(IPAddress.Loopback, 5001, 
                            listenOptions =>
                            {
                                listenOptions.UseHttps("testCert.pfx", 
                                    "testPassword");
                            });
                        serverOptions.Limits.KeepAliveTimeout = 
                            TimeSpan.FromMinutes(2);
                        serverOptions.Limits.RequestHeadersTimeout = 
                            TimeSpan.FromMinutes(1);
                    })
                    #endregion
                    .UseStartup<Startup>();
                });
#elif Port0

Параметры Kestrel также можно установить с помощью поставщика конфигурации. Например, поставщик конфигурации файлов (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1#file -configuration-provider ) может загружать конфигурацию Kestrel из наборов приложений. json или наборов приложений. {Environment}. json файл:

{
  "Kestrel": {
    "Limits": {
      "MaxConcurrentConnections": 100,
      "MaxConcurrentUpgradedConnections": 100
    },
    "DisableStringReuse": true
  }
}

Кроме того, если вам нужно управлять этими вещами с помощью кода, вы можете попытаться справиться с этим с помощью промежуточного программного обеспечения

public class RequestFilterMiddleware
    {
        private readonly RequestDelegate _next;
        private const long _allowedRequestQueryStringMaxLength = 100;
        private const long _allowedUrlStringMaxLength = 100;
        public RequestFilterMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            var queryStringLength = httpContext.Request.QueryString.Value?.Length;
            if (queryStringLength > _allowedRequestQueryStringMaxLength)
            {
                //throw exception or send some appropriate http status code
            }

            var urlRequestLength = httpContext.Request.GetDisplayUrl().Length;
            if (urlRequestLength > _allowedUrlStringMaxLength)
            {
                //throw exception or send some appropriate http status code
            }

            using (var TokenSource = System.Threading.CancellationTokenSource.CreateLinkedTokenSource(httpContext.RequestAborted))
            {
                httpContext.RequestAborted = TokenSource.Token;
                var DelayTask = Task.Delay(500, TokenSource.Token);
                var NextTask = _next.Invoke(httpContext);
                if (await Task.WhenAny(DelayTask, NextTask).ConfigureAwait(false) == DelayTask)
                {
                    //LogStuff for long running requests
                   
                }
                TokenSource.Cancel();
            }

            await _next(httpContext);
        }
    }

К сожалению, опция тайм-аута в Kestrel на данный момент недоступна, для получения дополнительной информации вы можете прочитать эту топи c https://github.com/dotnet/aspnetcore/issues/10079

Однако, по крайней мере, возможно регистрировать длительно выполняющиеся запросы на производстве для последующей оптимизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...