228 lines
7.7 KiB
C#
228 lines
7.7 KiB
C#
using Autofac;
|
|
using APT.Infrastructure.Core;
|
|
using APT.Migrations;
|
|
using APT.PF.WebApi.App_Start;
|
|
using log4net;
|
|
using log4net.Config;
|
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
|
using Microsoft.AspNetCore.Builder;
|
|
using Microsoft.AspNetCore.Hosting;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
using Newtonsoft.Json;
|
|
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using APT.BaseData.Domain.IServices;
|
|
using AutoMapper;
|
|
using APT.PF.WebApi.Models;
|
|
using System.Text.Encodings.Web;
|
|
using System.Text.Unicode;
|
|
using APT.Infrastructure.Core.Utils;
|
|
using Microsoft.AspNetCore.Http.Features;
|
|
using APT.Infrastructure.EF.Infrastructure;
|
|
using APT.Infrastructure.EF;
|
|
using APT.Infrastructure.EF.Extensions;
|
|
using APT.Infrastructure.Api;
|
|
using System.Collections.Generic;
|
|
using APT.Infrastructure.Api.Redis;
|
|
using APT.BaseData.Domain.ApiModel.Platform;
|
|
using System.Linq;
|
|
using ConfigurationManager = APT.Infrastructure.Api.ConfigurationManager;
|
|
using System.Threading;
|
|
using APT.WebApi.Models;
|
|
|
|
namespace APT.PF.WebApi
|
|
{
|
|
public partial class Startup
|
|
{
|
|
public Startup(IConfiguration configuration)
|
|
{
|
|
Configuration = configuration;
|
|
|
|
var repository = LogManager.GetRepository
|
|
(System.Reflection.Assembly.GetEntryAssembly());
|
|
var fileInfo = new FileInfo("log4net.config");
|
|
if (!fileInfo.Exists)
|
|
fileInfo = new FileInfo(Path.Combine(System.AppContext.BaseDirectory, "log4net.config"));
|
|
XmlConfigurator.Configure(repository, fileInfo);
|
|
ConfigurationManager.Register(configuration);
|
|
InitUtils.Init();
|
|
}
|
|
|
|
public IConfiguration Configuration { get; }
|
|
|
|
// This method gets called by the runtime. Use this method to add services to the container.
|
|
public void ConfigureServices(IServiceCollection services)
|
|
{
|
|
services.AddScoped<TenantInfo>();
|
|
services.AddScoped<IConnectionResolver, HttpHeaderSqlConnectionResolver>();
|
|
services.AddScoped<IConnectionGenerator, CombindedConnectionGenerator>();
|
|
|
|
services.AddSqlServerPerConnection<EfDbContext>(settings =>
|
|
{
|
|
settings.ConnectionPrefix = "";
|
|
});
|
|
|
|
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
|
|
|
//services.AddMvc();
|
|
//解决Multipart body length limit 134217728 exceeded
|
|
services.Configure<FormOptions>(x =>
|
|
{
|
|
x.ValueLengthLimit = int.MaxValue;
|
|
x.MultipartBodyLengthLimit = int.MaxValue; // In case of multipart
|
|
});
|
|
|
|
|
|
services.AddCors(o => o.AddPolicy("AllowAllPolicy", builder =>
|
|
{
|
|
builder.AllowAnyOrigin()
|
|
.AllowAnyMethod()
|
|
.AllowAnyHeader();
|
|
}));
|
|
|
|
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
|
//automapper
|
|
//AutoMapper.IConfigurationProvider config = new MapperConfiguration(cfg =>
|
|
//{
|
|
// cfg.AddProfile<MappingProfile>();
|
|
//});
|
|
AutoMapper.Configuration.MapperConfigurationExpression expression = new AutoMapper.Configuration.MapperConfigurationExpression();
|
|
expression.AddProfile(typeof(MappingProfile));
|
|
Mapper.Initialize(expression);
|
|
//services.AddSingleton(config);
|
|
//services.AddScoped<IMapper, Mapper>();
|
|
|
|
services.AddResponseCompression();
|
|
//
|
|
services.AddMvc(option => option.EnableEndpointRouting = false)
|
|
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
|
|
.AddNewtonsoftJson(options =>
|
|
{
|
|
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
|
|
options.SerializerSettings.ContractResolver = new JsonContractResolver();
|
|
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
|
|
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
|
|
});
|
|
|
|
services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All));
|
|
//UpdateDatabase();
|
|
services.RegisterBearAuth();
|
|
}
|
|
|
|
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
|
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
|
|
{
|
|
if (env.IsDevelopment())
|
|
{
|
|
app.UseDeveloperExceptionPage();
|
|
}
|
|
else
|
|
{
|
|
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
|
app.UseHsts();
|
|
}
|
|
|
|
Infrastructure.Api.HttpContext.Register(app.ApplicationServices.
|
|
GetRequiredService<IHttpContextAccessor>()
|
|
);
|
|
|
|
|
|
|
|
app.UseCors("AllowAllPolicy");
|
|
|
|
app.UseAuthentication();
|
|
|
|
app.UseHttpsRedirection();
|
|
|
|
app.UseResponseCompression();
|
|
|
|
app.UseMiddleware<TenantInfoMiddleware>();
|
|
|
|
app.UseMvc();
|
|
|
|
app.UseStaticFiles();
|
|
|
|
|
|
////fMOrganizationService.SetOrgCache();
|
|
//CheckLinse();
|
|
//UpdateDatabase();
|
|
APT.PF.WebApi.Utils.WebSokectHelper.Init();
|
|
}
|
|
|
|
public virtual void ConfigureContainer(ContainerBuilder builder)
|
|
{
|
|
builder.RegisterComponents();
|
|
Thread.Sleep(10000);
|
|
var dbs = GetAllDbConns();
|
|
foreach (var db in dbs)
|
|
{
|
|
if (!string.IsNullOrEmpty(db))
|
|
using (var context = new MigrationContext(db))
|
|
{
|
|
context.Database.Migrate();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void UpdateDatabase()
|
|
{
|
|
using (var context = new MigrationContext())
|
|
{
|
|
context.Database.Migrate();
|
|
}
|
|
}
|
|
private static string DesKey
|
|
{
|
|
get
|
|
{
|
|
var desKey = APT.Infrastructure.Api.ConfigurationManager.AppSettings["ConnDataKey"];
|
|
if (string.IsNullOrEmpty(desKey))
|
|
desKey = "optenergy2021001";
|
|
return desKey;
|
|
}
|
|
}
|
|
|
|
private static List<string> GetAllDbConns()
|
|
{
|
|
List<string> dbs = new List<string>();
|
|
List<string> conns = new List<string>();
|
|
var tenantConnKey = ConfigurationManager.AppSettings["TenantConnKey"]
|
|
+ "_All_" + ConfigurationManager.AppSettings["Env"];
|
|
//取redis
|
|
if (CsRedisManager.KeyExists(tenantConnKey))
|
|
{
|
|
conns = CsRedisManager.StringGet<List<string>>(tenantConnKey);
|
|
}
|
|
//查询
|
|
else
|
|
{
|
|
Thread.Sleep(10000);
|
|
var url = APT.Infrastructure.Api.ConfigurationManager.AppSettings["AllConnApiUrl"];
|
|
if (!string.IsNullOrEmpty(url))
|
|
{
|
|
url += $"?deskey={DesKey}";
|
|
conns = WebUtils.Get<List<string>>(url, "");
|
|
|
|
}
|
|
}
|
|
if (conns != null && conns.Any())
|
|
{
|
|
foreach (var conn in conns)
|
|
{
|
|
dbs.Add(EncryptHelper.AesDecrypt(conn, DesKey));
|
|
}
|
|
}
|
|
|
|
return dbs;
|
|
}
|
|
|
|
}
|
|
}
|