[ASP.NET WebAPI] #3 資料庫連線字串與環境設定:appsettings.json、Program.cs - antqtech/KM GitHub Wiki

AppSettings.json 和 Program.cs 是每個專案一開始自動生成的檔案。

AppSettings.json

AppSettings.json 是一個 JSON 格式的檔案,通常用來存放設定的地方,如資料庫連線字串

注意:可以透過 Microsoft.Extensions.Configuration 命名空間從應用程式中存取這些設定。

注意:應用程式設定可以存放在不同的設定來源中,如 appsettings.json 檔案、appsettings.{EnvironmentName}.json 檔案(其中 {EnvironmentName} 代表應用程式的當前運行環境,Development, Staging or Production)。

最常見的用途是設定資料庫連線字串:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "sqlconnect": "Server=XXX.XXX.XX.XX;Database=Stanec;uid=XXXXX;pwd=XXXXXXXXX;Trusted_Connection=False;TrustServerCertificate=true;MultipleActiveResultSets=true;"
  },
  "AllowedHosts": "*"
}

aspnetwebapi-3-1

  • Server -> 您的伺服器 IP
  • Database -> 您的資料庫名稱
  • Uid -> 您的使用者名稱
  • Pwd -> 密碼

這個連線字串會在 Program.cs 中使用,每次運行程式時都會連接到資料庫。

Program.cs

Program.cs 檔案是應用程式的進入點。它是一個 C# 檔案,包含 Main 方法,這是應用程式的起始點。每次我們執行這個程式時,都會從這裡開始。

public static void Main() 作為起始點

namespace Stanec_API
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // 將服務加入容器

            builder.Services.AddControllers();
            // 了解更多關於配置 Swagger/OpenAPI 的資訊 https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddDbContext<StanecDbContext>(cnn => cnn.UseSqlServer(builder.Configuration.GetConnectionString("sqlconnect"))); // 加入連線字串
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen(options => // 建立 swagger 
            {
                // 使用 JWT 機制進行授權標頭(在 Swagger 中添加鎖定按鈕)
                options.AddSecurityDefinition("Stanec",
                new OpenApiSecurityScheme
                {
                    Name = "Authorization",
                    Type = SecuritySchemeType.ApiKey,
                    Scheme = "Stanec",
                    BearerFormat = "JWT",
                    In = ParameterLocation.Header,
                    Description = "JWT 授權"
                });

                options.AddSecurityRequirement(
                    new OpenApiSecurityRequirement
                    {
                        {
                            new OpenApiSecurityScheme
                            {
                                Reference = new OpenApiReference
                                {
                                Type = ReferenceType.SecurityScheme,
                                Id = "Stanec"
                                }
                            },
                            new string[] {}
                        }
                    });
                // 編輯 Swagger UI 描述
                options.SwaggerDoc("v1", new OpenApiInfo
                {
                    Title = "Stanec",
                    Version = "v1",
                    Description = "這是一個 Stanec 數位名片的 Web API",

                });

                // 設定 Swagger XML 檔案路徑
                var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
            });

            builder.Services.AddCors(options =>
            {
                options.AddDefaultPolicy(builder =>
                {
                    builder
                        .WithOrigins("*") // 允許所有來源
                        .WithMethods("GET", "POST")
                        .AllowAnyHeader();
                });
            });

            // 註冊服務以明確告訴 ASP.NET Core DI 容器如何創建服務實例
            builder.Services.AddScoped<IEncryption, AesCryptoService>();
            builder.Services.AddScoped<IEmailTemplate, EmailTemplateService>();
            builder.Services.AddScoped<IGmail, GmailServices>();
            builder.Services.AddScoped<IJwtAuthFilter, JwtAuthFilterService>();
            builder.Services.AddScoped<IJwtAuthUtil, JwtAuthUtilService>();

            var app = builder.Build();

            string photoDirectory = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Photo");

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

            string[] subdirectories = { "ProfilePhoto", "BackgroundPhoto", "CompanyLogo" };

            foreach (var subdir in subdirectories)
            {
                string subdirPath = System.IO.Path.Combine(photoDirectory, subdir);
                if (!Directory.Exists(subdirPath))
                {
                    Directory.CreateDirectory(subdirPath);
                }
            }

            // 登記靜態檔案路徑
            app.UseStaticFiles(new StaticFileOptions()
            {
                FileProvider = new PhysicalFileProvider(photoDirectory),
                RequestPath = new PathString("/Photo"),
            });

            // 配置 HTTP 請求管道
            //if (app.Environment.IsDevelopment())
            //{
            app.UseSwagger();
            app.UseSwaggerUI();
            //}

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseCors();

            app.UseAuthorization();

            app.MapControllers();

            app.Run();
        }
    }
}

aspnetwebapi-3-2

1. Main 方法與 WebApplication 建構器

這部分初始化了 web 應用程式建構, 我們還利用 appsettings.json 中的資料連接到資料庫。

2. Swagger 配置

這部分生辰了 Swagger 以用於 API 文件生成,並增加了 JWT 支援。在這部分中,我們還為 API 添加了註釋。

3. CORS 配置

設定這個web應用程式的請求來源, 叫做Cross-Origin Resource Sharing

4. 服務註冊

這部分將各種服務註冊到依賴注入(DI dependency injection)容器中。

5. 應用程式建構與目錄設置

在web應用程式建立了資料夾, 會去放靜態檔案

6. 靜態檔案配置

設定預設的靜態檔案地方 [1]

7. 其他

執行其他的必要的功能

簡化版的頂層語句 (Top Level Statements)

(預設的 Program.cs)

var builder = WebApplication.CreateBuilder(args);

// 將服務加入容器

builder.Services.AddControllers();
// 了解更多關於配置 Swagger/OpenAPI 的資訊 https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// 配置 HTTP 請求管道
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

References

[1] https://learn.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-8.0