使用VS2022在ASP.NET Core中構建輕量級服務

在 ASP.NET Core 中處理 Web 應用程序時,我們可能經常希望構建輕量級服務,也就是沒有模板或控制器類的服務。

輕量級服務可以降低資源消耗,而且能夠提高性能。我們可以在 Startup 或 Program 類中創建這些輕量級服務或 API。

1. 使用 VS2022 創建 ASP.NET Core 項目

我們在 Visual Studio 2022 中創建一個 ASP.NET Core 項目。按照以下步驟在 Visual Studio 2022 中創建一個新的 ASP.NET Core Web API 6 項目。

  • 1) 啟動 Visual Studio 2022 IDE。
  • 2) 單擊 “Create new project”。
  • 3) 在 “Create new project” 窗口中,從顯示的模板列表中選擇 “ASP.NET Core Web API”。
  • 4) 點擊下一步。
  • 5) 在 “Configure your new project” 窗口中,指定新項目的名稱和位置。
  • 6) 根據您的偏好,可選擇選中 “Place solution and project in the same directory” 復選框。
  • 7) 點擊下一步。
  • 8) 在接下來顯示的 “Additional Information” 窗口中,從頂部的下拉列表中選擇 .NET 6.0 作為目標框架。將 “Authentication Type” 保留為 “None”(默認)。
  • 9) 確保未選中 “Enable Docker,”、“Configure for HTTPS” 和 “Enable Open API Support” 復選框,因為我們不會在此處使用任何這些功能。您也可以選擇取消選中 “Use controllers(取消選中以使用最少的 API)” 復選框,因為我們將創建自己的控制器。
  • 10) 單擊創建。

這將在 Visual Studio 2022 中創建一個新的 ASP.NET Core 6 Web API 項目。我們將在本文的後續部分中使用該項目,來說明如何使用輕量級服務。

2. 在 ASP.NET Core 中啟用一個輕量級的服務

由於我們將構建不需要控制器的輕量級服務,所以應該刪除 Controllers solution 文件夾和默認創建的任何模型類。

接下來,打開 Properties solution 文件夾下的 launchSettings.json 文件,刪除或註釋掉 launchUrl 鍵值對,如下面給出的代碼所示。

其中,launchUrl 是指應用程序的主機。當應用程序啟動時,launchURL 中指定的 URL 用於啟動應用程序。

如果 URL 錯誤或不存在,應用程序將在啟動時拋出錯誤。通過刪除 launchUrl 或將其註釋掉,我們可以確保應用程序不使用默認的 launchUrl 來啟動應用程序,從而避免任何錯誤。一旦 launchUrl 被刪除,應用程序將回到 5000 端口。

"profiles": {
    "Light_Weight_Services": {
        "commandName": "Project",
        "dotnetRunMessages": true,
        "launchBrowser": true,
        //"launchUrl": "",
        "applicationUrl": "http://localhost:5000",
        "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
        }
    },
    "IIS Express": {
        "commandName": "IISExpress",
        "launchBrowser": true,
        //"launchUrl": "",
        "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
        }
    }

3. 在 ASP.NET Core 中使用 IEndpointConventionBuilder 擴展方法

我們可以利用 IEndpointConventionBuilder 接口的一些擴展方法來映射請求。

以下是這些擴展方法的列表:

  • MapGet
  • MapPost
  • MapDelete
  • MapPut
  • MapRazorPages
  • MapControllers
  • MapHub
  • MapGrpcServices

MapGet、MapPost、MapDelete 和 MapPut 方法用於將請求委托連接到路由系統。MapRazorPages 用於 RazorPages,MapControllers 用於 Controllers,MapHub 用於 SignalR,MapGrpcService 用於 gRPC。

以下代碼說明瞭怎麼使用 MapGet 創建 HTTP Get 端點。

endpoints.MapGet("/", async context =>
{
     await context.Response.WriteAsync("Hello World!");
});

我們創建一個名為 Author 的 C# 文件,包含以下代碼:

public class Author
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

創建一個 Author 的隻讀列表,並填充一些數據,如下所示:

private readonly List<Author> _authors;
    public Startup(IConfiguration configuration)
    {
        _authors = new List<Author>
        {
            new Author
            {
                Id = 1,
                FirstName = "Joydip",
                LastName = "Kanjilal"
            },
            new Author
            {
                Id = 2,
                FirstName = "Steve",
                LastName = "Smith"
            },
            new Author
            {
                Id = 3,
                FirstName = "Julie",
                LastName = "Lerman"
            }
        };
        Configuration = configuration;
    }

我們可以使用以下代碼創建另一個端點,並以 JSON 格式返回作者列表。

endpoints.MapGet("/authors", async context =>
{
        var authors = _authors == null ? new List<Author>() : _authors;
        var response = JsonSerializer.Serialize(authors);
        await context.Response.WriteAsync(response);
});

4. 在 ASP.NET Core 中使用輕量級服務檢索記錄

要根據 Id 檢索特定記錄,我們可以編寫以下代碼:

endpoints.MapGet("/authors/{id:int}", async context =>
{
    var id = int.Parse((string)context.Request.RouteValues["id"]);
    var author = _authors.Find(x=> x.Id == id);
    var response = JsonSerializer.Serialize(author);
    await context.Response.WriteAsync(response);
});

5. 在 ASP.NET Core 中使用輕量級服務創建記錄

要使用 HTTP Post 添加數據,我們可以利用 MapPost 擴展方法,如下所示:

endpoints.MapPost("/", async context =>
{
    var author = await context.Request.ReadFromJsonAsync<Author>();
    _authors.Add(author);
    var response = JsonSerializer.Serialize(author);
    await context.Response.WriteAsync(response);
});

6. 在 ASP.NET Core 中使用輕量級服務刪除記錄

要刪除數據,我們可以利用 MapDelete 擴展方法,如下所示:

endpoints.MapDelete("/authors/{id:int}", async context =>
{
    var id = int.Parse((string)context.Request.RouteValues["id"]);
    var author = _authors.Find(x => x.Id == id);
    _authors.Remove(author);
    var response = JsonSerializer.Serialize(_authors);
    await context.Response.WriteAsync(response);
});

7. ASP.NET Core 中輕量級服務的配置方法

下面是 Startup 類的 Configure 方法的完整源碼:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
        endpoints.MapGet("/authors", async context =>
        {
            var authors = _authors == null ? new List<Author>() : _authors;
            var response = JsonSerializer.Serialize(authors);
            await context.Response.WriteAsync(response);
        });
        endpoints.MapGet("/authors/{id:int}", async context =>
        {
            var id = int.Parse((string)context.Request.RouteValues["id"]);
            var author = _authors.Find(x=> x.Id == id);
            var response = JsonSerializer.Serialize(author);
            await context.Response.WriteAsync(response);
        });
        endpoints.MapPost("/", async context =>
        {
            var author = await context.Request.ReadFromJsonAsync<Author>();
            _authors.Add(author);
            var response = JsonSerializer.Serialize(author);
            await context.Response.WriteAsync(response);
        });
        endpoints.MapDelete("/authors/{id:int}", async context =>
        {
            var id = int.Parse((string)context.Request.RouteValues["id"]);
            var author = _authors.Find(x => x.Id == id);
            _authors.Remove(author);
            var response = JsonSerializer.Serialize(_authors);
            await context.Response.WriteAsync(response);
        });
    });
}

8. 在 ASP.NET Core 的 Program 類中創建輕量級服務

在 ASP.NET 6 中還有另一種創建輕量級服務的方法。我們創建新的 ASP.NET Core 6 空項目時,默認情況下不會創建 Startup.cs 文件。因此,我們可以在 Program.cs 文件中編寫代碼,創建輕量級服務。

下面的例子說明如何執行此操作:

app.MapGet("/", () => "Hello World!");
app.MapDelete("/{id}", (Func<int, bool>)((id) => {
    // 刪除記錄代碼
    return true;
}));
    app.MapPost("/", (Func<Author, bool>)((author) => {
    // 添加記錄代碼
    return true;
}));
app.Run();

輕量級服務或 API 沒有模板,也不需要控制器類來創建它們。

我們可以在 Startup 或 Program 類中創建此類服務。

如果我們要在輕量級服務中實現授權,可以利用 IEndpointConventionBuilder 接口的 RequireAuthorization 擴展方法。

參考資料:

​編程寶庫​​​

​C#編程​

以上所述是小編給大傢介紹的使用VS2022在ASP.NET Core中構建輕量級服務,希望對大傢有所幫助。在此也非常感謝大傢對WalkonNet網站的支持!

推薦閱讀: