ASP.NET Core 7 项目在生产中首次加载需要很长时间

问题描述 投票:0回答:1

我有一个 ASP.NET Core 7 Razor 页面项目。它在本地主机上工作正常,但是当我将项目上传到互联网上的网络服务器时,第一次加载时,加载网站需要几秒钟,但后续请求很快。

这是我的

program.cs
文件 - 我的代码或服务器有问题吗?

我在 Stackoverflow 上搜索了其他帖子,其他程序员也有同样的问题,但没有找到好的解决方案!

using mywebsite.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Mvc;
using System.Text.Json.Serialization;
using Microsoft.Net.Http.Headers;
using mywebsite.Core.Middleware;
using Keyvan1.Utility;
using AutoMapper;
using GoogleReCaptcha.V3.Interface;
using GoogleReCaptcha.V3;


var builder = WebApplication.CreateBuilder(args);

builder.WebHost
       .CaptureStartupErrors(true)
       .UseSetting("detailedErrors", "true");

builder.Services.Configure<CookieTempDataProviderOptions>(options =>
{
    options.Cookie.Name = "mywebsiteTempDataCookie";
});


builder.Services.AddControllersWithViews()
                .AddJsonOptions(x => x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);

var keysDirectoryName = "Keys";

var keysDirectoryPath = Path.Combine(builder.Environment.ContentRootPath, keysDirectoryName);

if (!Directory.Exists(keysDirectoryPath))
{
    Directory.CreateDirectory(keysDirectoryPath);
}

builder.Services.AddDataProtection()
  .PersistKeysToFileSystem(new DirectoryInfo(keysDirectoryPath))
  .SetApplicationName("mywebsite")
  .SetDefaultKeyLifetime(TimeSpan.FromDays(30));

#if DEBUG
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer("Server=(local);Database=test;Trusted_Connection=True;TrustServerCertificate=True"));
#else
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
#endif

builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddIdentity<ApplicationUser, IdentityRole>(config => {
    config.SignIn.RequireConfirmedEmail = true;
    config.User.RequireUniqueEmail = true;
    // Password requirements
    config.Password.RequireDigit = false;
    config.Password.RequiredLength = 6;
    // config.Password.RequiredUniqueChars = 1;
    config.Password.RequireLowercase = true;
    config.Password.RequireNonAlphanumeric = false;
    config.Password.RequireUppercase = false;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options =>
{
    options.Cookie.Name = "mywebsite.Session";
    options.IdleTimeout = TimeSpan.FromHours(24);
    options.Cookie.IsEssential = true;
    options.Cookie.HttpOnly = true;
});

builder.Services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => false;
    options.MinimumSameSitePolicy = Microsoft.AspNetCore.Http.SameSiteMode.None;
});

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy(Constants.AdminRole, policy => policy.RequireRole(Constants.AdminRole));
});

builder.Services.ConfigureApplicationCookie(options =>
{
    // options.Cookie.HttpOnly = true;
    //options.Cookie.IsEssential = true;
    options.Cookie.Name = "KeyhanStore";
    options.ExpireTimeSpan = TimeSpan.FromDays(2);
    options.SlidingExpiration = true;
    options.LoginPath = $"/admin/Login";
    options.LogoutPath = $"/admin/Logout";
    options.AccessDeniedPath = $"/Areas/admin/AccessDenied";
});

builder.Services.AddRazorPages();
builder.Services.AddHttpContextAccessor();
builder.Services.AddCors(options => options.AddPolicy("Cors", builder =>
{
    builder
    .AllowAnyHeader()
    .AllowAnyMethod()
    //.AllowCredentials()
    .WithHeaders("accept", "content-type", "origin")
    .AllowAnyOrigin();
}));

builder.Services.Configure<PhotoSettings>(builder.Configuration.GetSection("PhotoSettings"));
builder.Services.Configure<EmailSettings>(builder.Configuration.GetSection("EmailSettings"));
builder.Services.AddHttpClient<ICaptchaValidator, GoogleReCaptchaValidator>();
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
builder.Services.AddScoped<IProductRepository, ProductRepository>();
builder.Services.AddTransient<IPhotoService, PhotoService>();
builder.Services.AddTransient<IPhotoStorage, PhotoStorage>();
builder.Services.AddTransient<IEmailService, EmailService>();
builder.Services.AddScoped<IStatsRepository, StatsRepository>();
builder.Services.AddScoped<IContactRepository, ContactRepository>();
builder.Services.AddScoped<ICategoryRepository, CategoryRepository>();
builder.Services.AddScoped<ISettingRepository, SettingRepository>();
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddTransient<IDbInitializer, DbInitializer>();


builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
Mapper.Initialize(x =>
{
    x.AddProfile<MappingProfile>();
});

 
builder.Services.AddMvc()
             .AddRazorPagesOptions(options =>
             {   options.Conventions.AuthorizeAreaFolder("admin", "/Products");
                 options.Conventions.AuthorizeAreaFolder("admin", "/Settings");
                 options.Conventions.AuthorizeAreaFolder("admin", "/Categories");
             });

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var context = services.GetRequiredService<ApplicationDbContext>();
    context.Database.Migrate();

    var dbInitializer = scope.ServiceProvider.GetRequiredService<IDbInitializer>();
    dbInitializer.Initialize();
}

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseCors("Cors");
app.UseSecurityHeadersMiddleware(
      new SecurityHeadersBuilder()
     .AddDefaultSecurePolicy());

app.UseHttpsRedirection();

app.UseStaticFiles(new StaticFileOptions
{
    OnPrepareResponse = ctx =>
    {
        const int durationInSeconds = 60 * 60 * 24;
        ctx.Context.Response.Headers[HeaderNames.CacheControl] =
            "public,max-age=" + durationInSeconds;
    }
});

app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.MapRazorPages();

#pragma warning disable ASP0014
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapAreaControllerRoute(
        "admin",
        "admin",
        "admin/{controller=Home}/{action=Index}/{id?}");
    endpoints.MapControllerRoute(
        "default", "{controller=Home}/{action=Index}/{id?}");

});
#pragma warning restore ASP0014

app.Run();

我需要项目在第一个请求时快速加载

razor razor-pages .net-7.0 asp.net-core-7.0
1个回答
0
投票

在应用程序加载、构建其管道、服务容器、路由等时,第一个请求遭受延迟影响是正常的。您可以采取一些措施来尽量减少这种情况,例如预构建服务(https://andrewlock.net/reducing-latency-by-pre-building-singletons-in-asp-net-core/),但你永远无法消除这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.