ASP.NET Core搭建多層網站架構【6-注冊跨域、網站核心配置】


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包是因為:

  1. 后期我們還要在MS.WebCore類庫中添加NLog的一些方法配置,需要依賴此包
  2. 這個包正好也包含了Microsoft.Extensions.ConfigurationMicrosoft.Extensions.DependencyInjection兩個組件,所以這兩個組件就不需要單獨重復引用了

但是這里我遇到一個問題,如果不使用NLog,可能不需要引用NLog.Web.AspNetCore包,而直接引用Microsoft.Extensions.ConfigurationMicrosoft.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中,UseRoutingUseAuthorization之間加上app.UseCors(WebCoreExtensions.MyAllowSpecificOrigins);以開啟跨域中間件:

至此,WebCore核心配置完成,此時網站項目已支持跨域配置,已可以通過ioc解析SiteSetting讀取網站配置和IdWorker生成雪花ID

項目完成后,如下圖所示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM