2020/01/29, ASP.NET Core 3.1, VS2019, NLog.Web.AspNetCore 4.9.0
摘要:基於ASP.NET Core 3.1 WebApi搭建后端多層網站架構【6-注冊跨域、網站核心配置】
統一封裝網站核心配置,注冊跨域策略,實例化雪花算法,后期可擴展添加多語言支持
本章節介紹了統一封裝網站核心配置,注冊跨域策略,實例化雪花算法,后期可擴展添加多語言支持
添加網站配置及跨域配置
在MS.WebApi
應用程序appsettings.json
中添加以下節點:
"SiteSetting": {
"WorkerId": 1, //for snowflake workerid
"DataCenterId": 1, //for snowflake datacenterid
"LoginFailedCountLimits": 3, //the number of login failed
"LoginLockedTimeout": 3 //(minutes) account locked timeout
},
"Startup": {
"Cors": {
"AllowOrigins": "http://localhost:8080,http://localhost:8081"
}
}
添加完成后,如下圖所示:
說明:
- WorkerId、DataCenterId是雪花算法的兩個參數
- LoginFailedCountLimits是用戶登錄失敗的次數限制
- LoginLockedTimeout是用戶鎖定后,多久可以重新登錄
- AllowOrigins中是允許跨域的源,逗號分隔
SiteSetting網站配置實體類
在MS.WebCore
類庫中添加SiteSetting.cs
類:
namespace MS.WebCore
{
public class SiteSetting
{
public long WorkerId { get; set; }
public long DataCenterId { get; set; }
public int LoginFailedCountLimits { get; set; }
public int LoginLockedTimeout { get; set; }
}
}
其中的字段和appsettings.json
中對應,可以使用選擇性粘貼,將json粘貼為類
添加包引用
向MS.WebCore
類庫添加以下包引用:
<ItemGroup>
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.0" />
</ItemGroup>
這里引用的是NLog.Web.AspNetCore
包是因為:
- 后期我們還要在
MS.WebCore
類庫中添加NLog的一些方法配置,需要依賴此包 - 這個包正好也包含了
Microsoft.Extensions.Configuration
、Microsoft.Extensions.DependencyInjection
兩個組件,所以這兩個組件就不需要單獨重復引用了
但是這里我遇到一個問題,如果不使用NLog,可能不需要引用NLog.Web.AspNetCore
包,而直接引用Microsoft.Extensions.Configuration
、Microsoft.Extensions.DependencyInjection
這兩個包
但是我在官網文檔中查到AddCors
方法依賴的就是Microsoft.Extensions.DependencyInjection
這個包,不知道為什么VS一直提示找不到?
如果你們不使用NLog可能需要自行解決下這個問題了~
封裝Ioc注冊
在MS.WebCore
類庫中添加WebCoreExtensions.cs
類:
using MS.Common.IDCode;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace MS.WebCore
{
public static class WebCoreExtensions
{
public const string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
/// <summary>
/// 添加跨域策略,從appsetting中讀取配置
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
/// <returns></returns>
public static IServiceCollection AddCorsPolicy(this IServiceCollection services, IConfiguration configuration)
{
services.AddCors(options =>
{
options.AddPolicy(MyAllowSpecificOrigins,
builder =>
{
builder
.WithOrigins(configuration.GetSection("Startup:Cors:AllowOrigins").Value.Split(','))
.AllowAnyHeader()
.AllowAnyMethod();
});
});
return services;
}
/// <summary>
/// 注冊WebCore服務,配置網站
/// do other things
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
/// <returns></returns>
public static IServiceCollection AddWebCoreService(this IServiceCollection services, IConfiguration configuration)
{
//綁定appsetting中的SiteSetting
services.Configure<SiteSetting>(configuration.GetSection(nameof(SiteSetting)));
#region 單例化雪花算法
string workIdStr = configuration.GetSection("SiteSetting:WorkerId").Value;
string datacenterIdStr = configuration.GetSection("SiteSetting:DataCenterId").Value;
long workId;
long datacenterId;
try
{
workId = long.Parse(workIdStr);
datacenterId = long.Parse(datacenterIdStr);
}
catch (Exception)
{
throw;
}
IdWorker idWorker = new IdWorker(workId, datacenterId);
services.AddSingleton(idWorker);
#endregion
return services;
}
}
}
說明:
- 封裝了跨域策略AddCorsPolicy
- 綁定appsetting中的SiteSetting
- 實例化雪花算法IdWorker並注冊為單例(保證全局只有一個單例)
注冊服務
在MS.WebApi
應用程序Startup.cs
類中,ConfigureServices方法里添加以下代碼:
//using MS.WebCore;
//添加以上代碼至using引用
//注冊跨域策略
services.AddCorsPolicy(Configuration);
//注冊webcore服務(網站主要配置)
services.AddWebCoreService(Configuration);
完成后代碼如下圖所示
開啟跨域中間件
在Configure中,UseRouting
和UseAuthorization
之間加上app.UseCors(WebCoreExtensions.MyAllowSpecificOrigins);
以開啟跨域中間件:
至此,WebCore核心配置完成,此時網站項目已支持跨域配置,已可以通過ioc解析SiteSetting讀取網站配置和IdWorker生成雪花ID
項目完成后,如下圖所示