网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using AspectCore.Extensions.DependencyInjection;
using Dpz.Core.Infrastructure.Configuration;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.KeyManagement;

const string originsName = "Open";
Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .CreateBootstrapLogger();
try
{
    var builder = WebApplication.CreateBuilder(args);
    builder.Host.UseAgileConfig();
    
    var configuration = builder.Configuration;

    var seq = configuration.GetSection("LogSeq").Get<LogSeq>();
    builder.Host.ConfigurationLog(seq);
    const int threads = 100;
    if (ThreadPool.SetMinThreads(threads, threads))
    {
        Log.Information("set worker threads:{WorkerThreads},set completion  port threads {CompletionPortThreads}", 
            threads,
            threads);
    }

    #region services

    var services = builder.Services;

    // IoC
    services.AddDefaultServices(configuration).AddAppScoped();
    
    services.AddControllers().AddXmlDataContractSerializerFormatters().AddJsonOptions(opts =>
    {
        opts.JsonSerializerOptions.Converters.Add(new TimeSpanConverter());
    });

    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[]
        {
            "application/font-woff2",
            "image/svg+xml",
            "text/plain",
            "application/lrc"
        });
    });
    
    services.Configure<BrotliCompressionProviderOptions>(options => { options.Level = CompressionLevel.Optimal; });
    
    services.Configure<GzipCompressionProviderOptions>(options => { options.Level = CompressionLevel.Optimal; });

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

    services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("v1",
            new OpenApiInfo
                {Title = "Dpz.Core.WebApi", Version = Assembly.GetEntryAssembly()?.GetName().Version?.ToString()});
        var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
        if (!string.IsNullOrEmpty(basePath))
        {
            var xmlPath = Path.Combine(basePath, "Dpz.Core.WebApi.xml");
            options.IncludeXmlComments(xmlPath);
        }

        options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
        {
            Description = "使用Bearer方案的JWT授权标头(示例:“ Bearer 12345abcdef”)",
            Name = "Authorization",
            In = ParameterLocation.Header,
            Type = SecuritySchemeType.ApiKey,
            Scheme = "Bearer"
        });

        options.AddSecurityRequirement(new OpenApiSecurityRequirement
        {
            {
                new OpenApiSecurityScheme
                {
                    Reference = new OpenApiReference
                    {
                        Type = ReferenceType.SecurityScheme,
                        Id = "Bearer"
                    }
                },
                Array.Empty<string>()
            }
        });
    });

    //缓存
    services.AddRedisCacheOutput(configuration.GetConnectionString("redis"));
    services.AddBusinessServices(configuration);

    // Cors
    services.AddCors(options =>
    {
        options.AddPolicy(originsName, cfg =>
        {
            cfg
                .WithOrigins(configuration.GetSection("Origins").Get<string[]>())
                .WithMethods("GET", "PUT", "POST", "DELETE", "PATCH")
                .AllowAnyHeader();
        });
    });

    services.Configure<TokenManagement>(configuration.GetSection("TokenManagement"));

    services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x =>
        {
            var token = configuration.GetSection("TokenManagement").Get<TokenManagement>();
            x.RequireHttpsMetadata = true;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(token.Secret)),
                ValidIssuer = token.Issuer,
                ValidAudience = token.Audience,
                ValidateIssuer = true,
                ValidateAudience = true
            };
        });
    services.AddDataProtection().SetApplicationName(AuthorizeCookieName);
    services.AddOptions<KeyManagementOptions>()
        .Configure<IServiceScopeFactory>((options, factory) =>
        {
            options.XmlRepository = new XmlRepositoryService(factory, AuthorizeCookieName + ".Key");
        });
    services.AddAuthorization(options =>
    {
        options.AddPolicy("System",
            policy => policy.Requirements.Add(new PermissionRequirement(Permissions.System)));
    });

    services.AddRazorPages(x => { x.Conventions.AddPageRoute("/SignIn", "signIn.html"); });

    //services.HangfireService(configuration);

    #endregion

    services.ConfigureDynamicProxy();

    builder.Host.UseServiceProviderFactory(new DynamicProxyServiceProviderFactory());
    var app = builder.Build();

    #region configuration

    if (app.Environment.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseSerilogRequestLogging(options =>
    {
        options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
        {
            diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value);
            diagnosticContext.Set("RequestScheme", httpContext.Request.Scheme);
            diagnosticContext.Set("UserAgent", httpContext.Request.Headers["User-Agent"].ToString());
            diagnosticContext.Set("IpAddress", httpContext.Request.GetIpAddress());
        };
    });

    app.UseResponseCompression();

    app.UseSwagger(_ =>
    {
        //options.SerializeAsV2 = true;
    });

    app.UseSwaggerUI(options =>
    {
        options.SwaggerEndpoint("/swagger/v1/swagger.json", "Dpz.Core.WebApi v1");
        options.InjectStylesheet("https://dpangzi.com/darkmode/theme-material.css");
    });

    app.GetHostingEnvironment();

    // //强制HTTPS
    // app.UseHttpsRedirection();

    app.UseRouting();

    app.MapRazorPages();

    app.UseResponseHeaders();

    app.UseCors(originsName);

    //身份认证
    app.UseAuthentication();
    //身份授权
    app.UseAuthorization();

    app.MapControllers();
    //app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

    //app.HangfireSetting();
    
    
    #endregion

    app.MapGet("/ping", () => "pong");
    Log.Information("Starting web api host,current process id:{ID}",Environment.ProcessId);
    app.Run();
}
catch (Exception e)
{
    Console.Error.WriteLine(e);
    Log.Fatal(e, "Host terminated unexpectedly");
}

/// <summary>
/// 
/// </summary>
public partial class Program
{
    /// <summary>
    /// 身份认证Cookie名称
    /// </summary>
    public const string AuthorizeCookieName = "Dpz.Web.Api.Server.Authoriza";

    /// <summary>
    /// 账号Cookie名称
    /// </summary>
    public const string AccountCookieName = "Dpz.Web.Api.Server.Account";
}
loading