共用方式為


教程:使用 .NET.NET Aspire 整合實作快取

雲端原生應用程式經常需要各種可擴充的快取解決方案來提升效能。 .NET Aspire 整合可簡化連線到熱門快取服務的過程,例如 Redis。 在本文中,您將瞭解如何:

  • 建立一個基本的 ASP.NET 核心應用程式,並設定為使用 .NET Aspire。
  • 新增 .NET Aspire 整合以連線至 Redis 並實作快取。
  • 設定 .NET.NET Aspire 整合以符合特定需求。

本文探討如何利用 ASP.NET Core 和 .NET Aspire來使用兩種不同類型的 Redis 快取:

  • 輸出快取:可設定的可延伸快取方法,用於儲存未來要求的整個 HTTP 回應。
  • 分散式快取:多個應用程式伺服器共用的快取,可讓您快取特定數據片段。 分散式快取通常會維護為存取它的應用程式伺服器的外部服務,並可改善 ASP.NET Core 應用程式的效能和延展性。

先決條件

若要使用 .NET.NET Aspire,您需要在本機安裝下列專案:

如需詳細資訊,請參閱 .NET.NET Aspire 設定和工具.NET.NET Aspire SDK

建立專案

  1. 在 Visual Studio頂端,流覽至 [檔案]>[新增>專案...]
  2. 在對話框視窗中,在專案範本搜尋方塊中輸入 .NET Aspire,然後選取 [.NET.NET Aspire 入門應用程式]。 選擇 [下一步]
  3. 在 [設定新專案 畫面:
    • 輸入 項目名稱AspireRedis
    • 將值的 rest 保留為預設值,然後選取 [下一步]
  4. 在 [其他資訊] 頁面:
    • 請確保已選取 .NET 9.0
    • 取消選擇 使用 Redis 進行的快取 。 您將設定您自己的快取機制。
    • 選取 建立

Visual Studio 會建立由下列項目組成的新 .NET Aspire 解決方案:

  • AspireRedis.Web - 具有預設 Blazor 組態的 .NET Aspire UI 專案。
  • AspireRedis.ApiService - 具有預設 .NET.NET Aspire 組態的最小 API,可提供前端的數據。
  • AspireRedis.AppHost - 協調器專案,其設計目的是連線及設定應用程式的不同項目和服務。
  • AspireRedis.ServiceDefaults - .NET.NET Aspire 共享專案,用來管理解決方案中與 韌性服務發現遙測相關的配置。

設定應用程式主機專案

  1. 新增 📦Aspire.Hosting.Redis NuGet 套件至 AspireRedis.AppHost 專案:

    dotnet add package Aspire.Hosting.Redis
    

    如需詳細資訊,請參閱 dotnet add package在 .NET 應用程式中管理套件相依性

  2. 更新 Program.cs 項目的 AspireRedis.AppHost 檔案,以符合下列程式代碼:

    var builder = DistributedApplication.CreateBuilder(args);
    
    var redis = builder.AddRedis("cache");
    
    var apiservice = builder.AddProject<Projects.AspireRedis_ApiService>("apiservice")
        .WithReference(redis);
    
    builder.AddProject<Projects.AspireRedis_Web>("webfrontend")
        .WithExternalHttpEndpoints()
        .WithReference(apiservice)
        .WithReference(redis);
    
    builder.Build().Run();
    

上述程式代碼會建立本機 Redis 容器實例,並設定UI和API,以自動將實例用於輸出和分散式快取。 程序代碼也會使用服務探索來設定前端UI與後端 API 之間的通訊。 透過 .NET.NET Aspire的隱式服務探索,設定和管理服務連線得到簡化,提升了開發人員的生產力。 在本教學課程的內容中,此功能可簡化連線至 Redis的方式。

傳統上,您會在每個專案的 Redis 檔案中手動指定 appsettings.json 連接字串:

{
  "ConnectionStrings": {
    "cache": "localhost:6379"
  }
}

使用此方法設定連接字串,雖然運作正常,但需要跨多個專案複製連接字元串,這很麻煩且容易出錯。

配置使用輸出快取的UI

  1. .NET Aspire Stack Exchange Redis 輸出快取 整合套件新增至您的 AspireRedis.Web 應用程式:

    dotnet add package Aspire.StackExchange.Redis.OutputCaching
    
  2. Program.csAspireRedis.Web 專案的 Blazor 檔案中,緊接在行 var builder = WebApplication.CreateBuilder(args);之後,新增對 AddRedisOutputCache 擴充方法的呼叫:

    builder.AddRedisOutputCache("cache");
    

    此方法會完成下列工作:

    • 設定 ASP.NET Core 輸出快取,以使用具有指定連接名稱的 Redis 實例。
    • 自動啟用對應的健康情況檢查、記錄和遙測。
  3. AspireRedis.Web 專案中,以以下內容取代 Blazor 檔案的內容:

    @page "/"
    @attribute [OutputCache(Duration = 10)]
    
    <PageTitle>Home</PageTitle>
    
    <h1>Hello, world!</h1>
    
    Welcome to your new app on @DateTime.Now
    

    整合包含 [OutputCache] 屬性,可快取整個已渲染的回應。 此頁面還包括一個對 @DateTime.Now 的呼叫,以幫助確認回應已被快取。

使用分散式快取設定 API

  1. .NET Aspire Stack Exchange Redis 分散式快取 整合套件新增至您的 AspireRedis.ApiService 應用程式:

    dotnet add package Aspire.StackExchange.Redis.DistributedCaching
    
  2. Program.cs 檔案頂端,新增對 AddRedisDistributedCache的呼叫:

    builder.AddRedisDistributedCache("cache");
    
  3. Program.cs 檔案中,新增下列 using 語句:

    using System.Text;
    using System.Text.Json;
    using Microsoft.Extensions.Caching.Distributed;
    
  4. Program.cs 檔案中,將現有的 /weatherforecast 端點程式碼取代為下列專案:

    app.MapGet("/weatherforecast", async (IDistributedCache cache) =>
    {
        var cachedForecast = await cache.GetAsync("forecast");
    
        if (cachedForecast is null)
        {
            var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
            var forecast = Enumerable.Range(1, 5).Select(index =>
            new WeatherForecast
            (
                DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                Random.Shared.Next(-20, 55),
                summaries[Random.Shared.Next(summaries.Length)]
            ))
            .ToArray();
    
            await cache.SetAsync("forecast", Encoding.UTF8.GetBytes(JsonSerializer.Serialize(forecast)), new ()
            {
                AbsoluteExpiration = DateTime.Now.AddSeconds(10)
            }); ;
    
            return forecast;
        }
    
        return JsonSerializer.Deserialize<IEnumerable<WeatherForecast>>(cachedForecast);
    })
    .WithName("GetWeatherForecast");
    

在本機測試應用程式

使用下列步驟測試應用程式的快取行為:

  1. 按下 Visual Studio,使用 執行應用程式。
  2. 如果出現 [開始 Docker 桌面] 對話框,請選取 [是],然後以啟動服務。
  3. .NET .NET Aspire 儀表板會在瀏覽器中載入,並列出介面和應用程式介面專案。

測試輸出快取:

  1. 在 [專案] 頁面上,在 [webfrontend] 列中,點擊 [localhost] 欄中的 [] 連結,以開啟應用程式的 UI。
  2. 應用程式會在首頁上顯示目前的時間。
  3. 每隔幾秒鐘重新整理瀏覽器,以查看輸出快取所傳回的相同頁面。 快取會在 10 秒後過期,且頁面會重新載入並顯示更新的時間。

測試分散式快取:

  1. 流覽至 UI 上的 [Blazor] 頁面,以載入隨機化天氣數據的數據表。
  2. 每隔幾秒鐘刷新瀏覽器,以查看輸出快取所傳回的相同天氣資料。 快取會在 10 秒之後過期,且頁面會重載更新的天氣數據。

祝賀! 您已設定 ASP.NET Core 應用程式,使用 .NET Aspire來進行輸出和分散式快取。