2026-06-01 部署 Web API

2026-06-01 部署 Web API

我:
3. 部署 Web API

  • 使用 DockerAzure App Service 部署你的 Web API。
  • 學習如何將 API 部署到雲端,讓其他人也能訪問。
    這要如何做?

GPT:
作業說明:擴展 DAO 方法與異常處理

第 1 部分:添加更多 DAO 方法

  1. 更新包裹的方法

    • 在您的 DAO 類別中添加一個名為 updatePackage 的方法,用於更新包裹的狀態或其他屬性。
    • 方法應接收一個 Package 物件(包含更新後的所有屬性),並根據 TrackingNumber 來執行更新。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public bool UpdatePackage(Package package)
    {
    string query = "UPDATE Packages SET Sender = @Sender, Recipient = @Recipient, Status = @Status WHERE TrackingNumber = @TrackingNumber";
    using (var connection = new SqlConnection(connectionString))
    {
    using (var command = new SqlCommand(query, connection))
    {
    command.Parameters.AddWithValue("@Sender", package.Sender);
    command.Parameters.AddWithValue("@Recipient", package.Recipient);
    command.Parameters.AddWithValue("@Status", package.Status);
    command.Parameters.AddWithValue("@TrackingNumber", package.TrackingNumber);

    connection.Open();
    int rowsAffected = command.ExecuteNonQuery();
    return rowsAffected > 0;
    }
    }
    }
  2. 刪除包裹的方法

    • 添加一個名為 deletePackage 的方法,用於根據 TrackingNumber 刪除包裹記錄。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public bool DeletePackage(string trackingNumber)
    {
    string query = "DELETE FROM Packages WHERE TrackingNumber = @TrackingNumber";
    using (var connection = new SqlConnection(connectionString))
    {
    using (var command = new SqlCommand(query, connection))
    {
    command.Parameters.AddWithValue("@TrackingNumber", trackingNumber);

    connection.Open();
    int rowsAffected = command.ExecuteNonQuery();
    return rowsAffected > 0;
    }
    }
    }

第 2 部分:進一步測試資料庫操作

  1. 更新單元測試

    • 更新現有的單元測試來測試 updatePackagedeletePackage 方法。
    • 您可以使用 Moq 等模擬工具來模擬資料庫連接和操作,以確保您的 DAO 在沒有實際資料庫的情況下也能進行測試。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    [TestMethod]
    public void UpdatePackage_ShouldReturnTrue_WhenPackageIsUpdated()
    {
    // Arrange
    var package = new Package { TrackingNumber = "12345ABC", Sender = "NewSender", Recipient = "NewRecipient", Status = "Delivered" };
    var dao = new PackageDao();

    // Act
    bool result = dao.UpdatePackage(package);

    // Assert
    Assert.IsTrue(result);
    }

    [TestMethod]
    public void DeletePackage_ShouldReturnTrue_WhenPackageIsDeleted()
    {
    // Arrange
    var trackingNumber = "12345ABC";
    var dao = new PackageDao();

    // Act
    bool result = dao.DeletePackage(trackingNumber);

    // Assert
    Assert.IsTrue(result);
    }

第 3 部分:加入異常處理

  1. 資料庫操作中的異常處理

    • 在每個 DAO 方法中加入 try-catch 塊,以便在發生異常時能夠捕捉並處理,例如資料庫連接失敗或 SQL 語句執行失敗。
    • 可以記錄異常訊息,並根據需要返回錯誤碼或自定義的異常類型。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public bool UpdatePackage(Package package)
    {
    string query = "UPDATE Packages SET Sender = @Sender, Recipient = @Recipient, Status = @Status WHERE TrackingNumber = @TrackingNumber";
    try
    {
    using (var connection = new SqlConnection(connectionString))
    {
    using (var command = new SqlCommand(query, connection))
    {
    command.Parameters.AddWithValue("@Sender", package.Sender);
    command.Parameters.AddWithValue("@Recipient", package.Recipient);
    command.Parameters.AddWithValue("@Status", package.Status);
    command.Parameters.AddWithValue("@TrackingNumber", package.TrackingNumber);

    connection.Open();
    int rowsAffected = command.ExecuteNonQuery();
    return rowsAffected > 0;
    }
    }
    }
    catch (SqlException ex)
    {
    // 記錄異常訊息並處理
    Console.WriteLine("An error occurred while updating the package: " + ex.Message);
    return false;
    }
    }
  2. 全域異常處理

    • 在應用程式中設置全域異常處理器,用於捕捉未預期的異常,防止應用程式崩潰。

第 4 部分:部署 Web API

  1. 使用 Docker 部署 Web API

    • 編寫 Dockerfile:為您的 Web API 編寫一個 Dockerfile,描述應用程式如何構建和運行。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      # 使用官方的 .NET Core SDK 作為基礎映像
      FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
      WORKDIR /app
      EXPOSE 80

      FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
      WORKDIR /src
      COPY . .
      RUN dotnet publish -c Release -o /app/build

      FROM base AS final
      WORKDIR /app
      COPY --from=build /app/build .
      ENTRYPOINT ["dotnet", "YourWebApi.dll"]
    • 構建 Docker 映像:在專案目錄中運行以下命令來構建映像:

      1
      docker build -t yourwebapi-image .
    • 運行 Docker 容器:使用以下命令運行您的 Web API 容器:

      1
      docker run -d -p 8080:80 yourwebapi-image
    • 訪問 API:您的 API 將在本地的 http://localhost:8080 上可用。

  2. 使用 Azure App Service 部署 Web API

    • 創建 Azure App Service:登入 Azure 入口網站,創建一個新的 App Service,選擇適合的方案。

    • 部署 Web API:可以使用 Visual Studio 直接發布,也可以使用 Azure CLI:

      1
      az webapp up --name yourwebapi-app --resource-group your-resource-group --location your-location
    • 配置應用設置:在 Azure App Service 中配置應用的連接字串和其他必要的環境變數。

  3. 學習資料

    學習如何將 API 部署到雲端,這樣其他人就能通過網路訪問您的 Web API。