1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

.NET を使ったウェブサーバー構築クイックスタート

Posted at

.NET を使ってウェブサーバーを構築する。
利用している .NET 環境は以下。

$ dotnet --info
.NET SDK:
 Version:           8.0.203
 Commit:            5e1ceea679
 Workload version:  8.0.200-manifests.4e94be9c

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  15.1
 OS Platform: Darwin
 RID:         osx-x64
 Base Path:   /usr/local/share/dotnet/sdk/8.0.203/

.NET workloads installed:
There are no installed workloads to display.

Host:
  Version:      8.0.3
  Architecture: x64
  Commit:       9f4b1f5d66

.NET SDKs installed:
  8.0.203 [/usr/local/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 8.0.3 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 8.0.3 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]

Other architectures found:
  None

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download

ソリューション作成

まず以下のようにディレクトリが作成されているとする。

.
└── src
    └── server

ルートのディレクトリで以下のコマンドを実行。
sln ファイルが src/server ディレクトリ内に作成される。

dotnet new sln --name TestWebApp.Server --output src/server

オプション

.editorconfig.gitignore を作成する。

.editorconfig はルートディレクトリで以下のコマンドを実行して作成。

dotnet new editorconfig

設定は後でいいように変更するがとりあえず置いておく。

dotnet 用の .gitignore ファイルを以下のコマンドで作成。
コマンドは src/server ディレクトリ内で実行した。

# cd src/server
dotnet new gitignore

現在のディレクトリ構成はこんな感じ。

.
├── .editorconfig
└── src
    ├── client
    └── server
        ├── .gitignore
        └── TestWebApp.Server.sln

WebAPI プロジェクトの作成

# cd src/server
dotnet new webapi --name TestWebApp.Server.Api --output TestWebApp.Server.Api --use-controllers

実行

cd TestWebApp.Server.Api
dotnet run
$ dotnet run
Building...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

http://localhost:5001/swagger にアクセスできる。

ソリューションに作成したプロジェクトを追加する。

# cd src/server
dotnet sln add TestWebApp.Server.Api

現在の構成

.
├── .editorconfig
└── src
    └── server
        ├── .gitignore
        ├── TestWebApp.Server.Api
        │   ├── Controllers
        │   │   └── WeatherForecastController.cs
        │   ├── Program.cs
        │   ├── Properties
        │   │   └── launchSettings.json
        │   ├── TestWebApp.Server.Api.csproj
        │   ├── TestWebApp.Server.Api.http
        │   ├── WeatherForecast.cs
        │   ├── appsettings.Development.json
        │   └── appsettings.json
        └── TestWebApp.Server.sln

独自 API を実装する

デフォルトで天気予報の API があるが、それはいったん削除する。
削除するファイルは以下。

  • WeatherForecastController.cs
  • WeatherForecast.cs

API を追加するには Controllers ディレクトリ配下に一定の決まりを持ってクラスを作成していく。
例として、以下のような API を提供するコントローラを追加する。

  • GET /api/system/ping
  • POST /api/system/echo

これを提供するコントローラの実装は以下。

using Microsoft.AspNetCore.Mvc;

namespace TestWebApp.Server.Api.Controllers;

[ApiController, Route("api/system")]
public class SystemController : ControllerBase
{
    [HttpGet("ping")]
    public Task<IActionResult> Ping()
    {
        return Task.FromResult<IActionResult>(Ok(new { Message = "Ok" }));
    }

    [HttpPost("echo")]
    public Task<IActionResult> Echo([FromBody] dynamic body)
    {
        return Task.FromResult<IActionResult>(Ok(body));
    }
}

ポイントをまとめると、、、

ControllerBase を継承してクラスに適切な属性をつける

コントローラの実装には、まず ControllerBase クラスを継承する。
(この辺りの実装で利用するクラスは大体 Microsoft.AspNetCore.Mvc 名前空間のもの)

次に ApiController 属性をクラスにつける。

API のパスに api/system というようなプレフィックスをつけたい場合には、クラスに対して Route 属性をつけて、引数にプレフィックスを指定する。

HttpGet 属性で GET リクエストをハンドルする

API を実装するため IActionResult か非同期ならば Task<IActionResult> を返すメソッドを追加する。
追加したメソッドに HttpGet 属性をつけて、ハンドルしたいパスを引数に指定する。

この例では ping と指定し、クラスには Route("api/system") 属性を指定しているので、結果的に api/system/ping をこのメソッドがハンドルすることになる。

Ok というのは ControllerBase から継承されたメソッドで、200 のリスポンスを作成してくれる。引数に指定したオブジェクトは JSON に変換される。他にも NotFound などがある。

HttpPost 属性で POST リクエストをハンドルする

GET の時と同様にメソッドを追加して、そのメソッドに HttpPost 属性をつける。引数にはパスを指定する。

メソッドの引数には期待する型 (ここではなんでも受け入れるように dynamic にしている) を指定して FromBody 属性をつける。
型には任意のクラスを指定できる。

返し方は GET リクエストのときと同じ。

API をテストする

dotnet で作成したウェブ API にはデフォルトで Swagger が組み込まれている。
なので dotnet run で実行した後 http://localhost:{PORT}/swagger にアクセスすると作成した API を簡単にテストすることができる。

Swagger page when implementing system controller

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?