C# ASP.NET Core Webサービスで Hello World する

# C# ASP.NET Core Webサービスで Hello World する

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 24.04 で C# ASP.NET Core Web アプリケーションを作成して Hello World を出力する方法を紹介します。
![aspnet-core_on_ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/e9ba416f-0a0b-f5ea-2d40-f81febbb479f.png)

## 目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

https://qiita.com/studio_meowtoon/items/6119ab05d8b13527efd8

## 実現すること

ローカル環境の Ubuntu で、C# ASP.NET Core Web サービスの DLL ファイル形式のアプリを起動します。

**DLL ファイル形式のアプリを起動**
```mermaid
flowchart LR
    terminal --> kestrel
    subgraph Ubuntu
        subgraph dotnet
            kestrel <--> WebApp.dll
        end
    end
style Ubuntu fill:#FFBCA4, stroke:#E0460F
style dotnet fill:#DCFFDC, stroke:#2F872F
style kestrel fill:#FFFFDE, stroke:#B4AE43
```

|要素|概要|
|:--|:--|
|terminal|ターミナル|
|Ubuntu|OS|
|dotnet|.NET 実行環境|
|kestrel|Web サーバー|
|WebApp.dll|.NET アプリケーション|

:::note alert
C# には本来[厳格なコーディング規則](https://learn.microsoft.com/ja-jp/dotnet/csharp/fundamentals/coding-style/coding-conventions)がありますが、この記事では可読性のために、一部規則に沿わない表記方法を使用しています。ご注意ください。
:::

## 技術トピック

### ASP.NET Core とは？  

<details>
<summary>こちらを展開してご覧いただけます。</summary>

### [ASP.NET Core](https://learn.microsoft.com/ja-jp/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-6.0)

:::note info
ASP.NET Core は、Microsoft が開発したオープンソースの Web アプリケーションフレームワークです。  

|特徴|
|:--|
|クロスプラットフォームで動作します。|
|ASP.NET Coreは、Web アプリケーション、API、マイクロサービス、および IoT アプリケーションの開発に使用できます。|
|ASP.NET Core には、軽量なリクエスト処理パイプライン、依存関係注入、テスト可能なアーキテクチャ、およびクロスプラットフォームのサポートが組み込まれています。|
|ASP.NET Core は、C#、F#、および Visual Basic をサポートし、Visual Studio、VS Code、およびその他のエディターで開発できます。|

:::
</details>

## 開発環境

+ Windows 11 Home 23H2 を使用しています。  

:::note info
[WSL](https://learn.microsoft.com/ja-jp/windows/wsl/about) の Ubuntu を操作していきますので macOS の方も参考にして頂けます。  
:::

<details>

WSL (Microsoft Store アプリ版) [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/cd0c4a607d451dbf5430)

```sh
> wsl --version
WSL バージョン: 2.2.4.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.61
```

Ubuntu [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/cd0c4a607d451dbf5430)

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04 LTS
Release:        24.04
Codename:       noble
```

.NET SDK [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/d68031c91462f6808dff)

```sh
$ dotnet --list-sdks
8.0.107 [/usr/lib/dotnet/sdk]
$ dotnet --version
8.0.107
```

</details>

:::note warn
この記事では基本的に Ubuntu のターミナルで操作を行います。**Vim を使用してコピペする方法**を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。
:::

https://qiita.com/studio_meowtoon/items/7771ad48676926e41463

## 作成する Web アプリケーションの仕様

|No|エンドポイント|HTTPメソッド|MIME タイプ|
|:--|:--|:--|:--|
|1|/api/data|GET|application/json|

:::note info
**/api/data** というエンドポイントに対して HTTP GET リクエストを送信すると、JSON データがレスポンスされるシンプルな Web サービスを実装します。
**{"message":"Hello World!"}**
:::

## Hello World を表示する手順

### プロジェクトルートフォルダに移動

プロジェクトルートフォルダに移動します。  
※ ~/tmp/WebApp をプロジェクトフォルダとします。

```sh
$ cd ~/tmp
```

### プロジェクトの作成

プロジェクトを作成します。

```sh
$ dotnet new web -n WebApp
```

プロジェクトフォルダに移動します。

```sh
$ cd ~/tmp/WebApp
```

### Program クラスの修正

Program クラスを修正します。

```sh
$ vim Program.cs
```

ファイルの内容

```csharp:Program.cs
using System.Text.Json;

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();

WebApplication app = builder.Build();
configure(app);

static void configure(IApplicationBuilder app) {
    app.UseRouting();
    app.UseEndpoints(endpoints => endpoints.MapGet("/api/data", handleGetData));
}

static async Task handleGetData(HttpContext context) {
    object data = new { message = "Hello World!" };
    String json = JsonSerializer.Serialize(data);
    context.Response.ContentType = "application/json";
    await context.Response.WriteAsync(json);
}

app.Run();
```

<details>
<summary>このように記述することも可能です。</summary>

ファイルの内容

```csharp:Program.cs
using System.Text.Json;

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();

WebApplication app = builder.Build();
app.UseRouting();

app.UseEndpoints(endpoints => {
    endpoints.MapGet("/api/data", async context => {
        object data = new { message = "Hello World!" };
        String json = JsonSerializer.Serialize(data);
        context.Response.ContentType = "application/json";
        await context.Response.WriteAsync(json);
    });
    endpoints.MapControllers();
});

app.Run();
```

</details>

### アプリのビルドと起動

アプリを起動します。
※ アプリを停止するときは ctrl + C を押します。

```sh
$ dotnet run
```

:::note info
ここまでの手順で、**Ubuntu** でアプリの **DLL ファイル**を起動することができました。
:::

### アプリの動作確認

:::note warn
アプリを起動したターミナルにアプリがリッスンする URL が表示されています。※ **ポート番号**は**変動**するので読み替えてください。
:::

```sh:一部抜粋
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5079
```

別ターミナルから curl コマンドで確認します。

```sh
$  curl -v http://localhost:5079/api/data -w "\n"
```

出力

```sh
* Host localhost:5079 was resolved.
* IPv6: ::1
* IPv4: 127.0.0.1
*   Trying [::1]:5079...
* Connected to localhost (::1) port 5079
> GET /api/data HTTP/1.1
> Host: localhost:5079
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Wed, 17 Jul 2024 13:15:16 GMT
< Server: Kestrel
< Transfer-Encoding: chunked
<
* Connection #0 to host localhost left intact
{"message":"Hello World!"}
```

:::note info
ここまでの手順で、ターミナルに **{"message":"Hello World!"}** と表示され、**JSON データ**を取得することが出来ました。
:::

## まとめ

Ubuntu に構築したシンプルな .NET の開発環境で、C# ASP.NET Core Web サービスを実行することができました。

:::note warn
実際の業務での ASP.NET Core の使用ケースでは、ここで示したようなシンプルな構成とは異なる場合があります。しかしながら、最小構成の例を学ぶことで、ASP.NET Core がどのような構成が必要なのかを理解することができます。
:::

どうでしたか？ WSL Ubuntu で、C# ASP.NET Core Web アプリケーションを手軽に起動することができます。ぜひお試しください。今後も .NET の開発環境などを紹介していきますので、ぜひお楽しみにしてください。

## 推奨コンテンツ

https://qiita.com/studio_meowtoon/items/d469de7f4cfe62aa5641

## 関連記事

#### Java Spring Boot

https://qiita.com/studio_meowtoon/items/37ac0082a3228e4de570