.NET Core の WebAPI（C#）をIISにデプロイする（VisualStudioCode）

# 環境

* Windows10 Pro
* Visual Studio Code (VSCodeUserSetup-x64-1.40.2.exe)・・・高機能テキストエディタ
* .NET Core (dotnet-sdk-3.1.100-win-x64.exe)・・・API作るためのもの
* .NET Core ホスティング バンドル (dotnet-hosting-3.1.1-win.exe)・・・APIがIISで動くようにするもの
  * ※v3.1.0は環境によっては500 Internal Server Errortが発生する。

# 前提

* [Visual Studio Code](https://code.visualstudio.com/download) インストール済み
* [.NET Core 3.1 SDK](https://dotnet.microsoft.com/download/dotnet-core/sdk-for-vs-code?utm_source=vs-code&amp;utm_medium=referral&amp;utm_campaign=sdk-install) ダウンロード済み
* [ASP.NET Core 3.1 Runtime (v3.1.1) - Windows Hosting Bundle](https://dotnet.microsoft.com/download/dotnet-core/thank-you/runtime-aspnetcore-3.1.1-windows-hosting-bundle-installer) ダウンロード取得済み
  * ※v3.1.0は環境によっては500 Internal Server Errortが発生する。

# 流れ

1. .NETCore インストール
1. WebAPI作成
1. Visual Studio Codeでデバッグ実行
1. WebAPIのアプリ発行（デプロイ物作成）
1. IISの有効化
1. .NET Core ホスティング バンドル インストール
1. IISにデプロイ

## .NETCore インストール

dotnet-sdk-3.1.100-win-x64.exeを実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/fb498fa4-1052-5ce4-a00e-f4eb704d0fcb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/19c9b9d7-04c8-1b99-8992-360129e4db8e.png)

## WebAPI作成

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

以下のコマンド実行でプロジェクトのセットファイルが作られ、サンプルAPIの「WeatherForecastController.cs」も含まれる。

```
PS D:\git\cshaptest> dotnet new webapi -o HelloApi
The template "ASP.NET Core Web API" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on HelloApi\HelloApi.csproj...
  D:\git\cshaptest\HelloApi\HelloApi.csproj の復元が 135.98 ms で完了しました。

Restore succeeded.
```

```
HelloApi
│  appsettings.Development.json
│  appsettings.json
│  HelloApi.csproj
│  Program.cs
│  Startup.cs
│  WeatherForecast.cs
│
├─Controllers
│      WeatherForecastController.cs
│
├─obj
│      HelloApi.csproj.nuget.cache
│      HelloApi.csproj.nuget.dgspec.json
│      HelloApi.csproj.nuget.g.props
│      HelloApi.csproj.nuget.g.targets
│      project.assets.json
│
└─Properties
        launchSettings.json
```

### ビルド

ビルドするとbinフォルダができてビルド結果のexeなどが生成される。

```
cd HelloApi
PS D:\git\cshaptest\HelloApi> dotnet build
.NET Core 向け Microsoft (R) Build Engine バージョン 16.4.0+e901037fe
Copyright (C) Microsoft Corporation.All rights reserved.

  D:\git\cshaptest\HelloApi\HelloApi.csproj の復元が 26.62 ms で完了しました。
  HelloApi -> D:\git\cshaptest\HelloApi\bin\Debug\netcoreapp3.1\HelloApi.dll

ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:07.66
```

```
HelloApi
│  appsettings.Development.json
│  appsettings.json
│  HelloApi.csproj
│  Program.cs
│  Startup.cs
│  WeatherForecast.cs
│
├─bin
│  └─Debug
│      └─netcoreapp3.1
│          │  appsettings.Development.json
│          │  appsettings.json
│          │  HelloApi.deps.json
│          │  HelloApi.dll
│          │  HelloApi.exe
│          │  HelloApi.pdb
│          │  HelloApi.runtimeconfig.dev.json
│          │  HelloApi.runtimeconfig.json
│          │
│          └─Properties
│                  launchSettings.json
│
├─Controllers
│      WeatherForecastController.cs
│
├─obj
│  │  HelloApi.csproj.nuget.cache
│  │  HelloApi.csproj.nuget.dgspec.json
│  │  HelloApi.csproj.nuget.g.props
│  │  HelloApi.csproj.nuget.g.targets
│  │  project.assets.json
│  │
│  └─Debug
│      └─netcoreapp3.1
│          │  HelloApi.AssemblyInfo.cs
│          │  HelloApi.AssemblyInfoInputs.cache
│          │  HelloApi.assets.cache
│          │  HelloApi.csproj.FileListAbsolute.txt
│          │  HelloApi.csprojAssemblyReference.cache
│          │  HelloApi.dll
│          │  HelloApi.exe
│          │  HelloApi.MvcApplicationPartsAssemblyInfo.cache
│          │  HelloApi.pdb
│          │  HelloApi.RazorTargetAssemblyInfo.cache
│          │
│          └─staticwebassets
│                  HelloApi.StaticWebAssets.Manifest.cache
│                  HelloApi.StaticWebAssets.xml
│
└─Properties
        launchSettings.json
```

### 実行

```
PS D:\git\cshaptest\HelloApi> dotnet run
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: D:\git\cshaptest\HelloApi
```

https://localhost:5001/WeatherForecast
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/451f2939-66de-70b4-e7ed-7dc5b283dfb8.png)

### 停止

Ctrl + C

```
info: Microsoft.Hosting.Lifetime[0]
      Application is shutting down...
```

# Visual Studio Code でデバッグ実行

単なるテキストエディタ + コマンドでもいいけど、Visual Studio Codeを使うことでデバッグ実行ができてブレークポイントとかも置けて便利。

## プロジェクトを開く

さっきコマンドで作ったプロジェクトのフォルダを指定して開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/854d6dca-9a73-b0a1-2530-3b06934bfede.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/73460ea9-0354-621d-3386-0ac5c1eb22e3.png)

## 新しいAPIを作成

Controllersフォルダで右クリックして「HelloController.cs」作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/2837c8f9-d647-8f97-fa87-e84ad27bc89d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/f3aa6c88-15da-793d-4206-8921192f1146.png)

作成した「HelloController.cs」コードはこちら。

```C#
using System;
using Microsoft.AspNetCore.Mvc;

namespace HelloWorld.Controllers
{
    [ApiController]
    [Route("api/{controller}")]
    public class HelloController : ControllerBase
    {
        // GET: Hello
        [HttpGet(Name = "hello")]
        public String Hello()
        {
            return "Hello!";
        }
    }
}
```

## デバッグ実行

「Start Debugging」を実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/4dff90b3-1abe-3d9a-de07-713d9ad44b36.png)
Environmentは「.NET Core」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/d4617cc8-b1f5-fbb6-f4ba-55828048d137.png)
Visual Studio Codeはターミナルで標準で出てきて助かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/2da72578-2c2d-38f3-c375-65e9dd00e8ce.png)

https://localhost:5001/api/hello

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/184db92c-e0de-9f33-44f1-1b8b6b1bad8f.png)

# WebAPIのアプリ発行（デプロイ物作成）

```
PS D:\git\cshaptest\HelloApi> dotnet publish --configuration Release
.NET Core 向け Microsoft (R) Build Engine バージョン 16.4.0+e901037fe
Copyright (C) Microsoft Corporation.All rights reserved.

  D:\git\cshaptest\HelloApi\HelloApi.csproj の復元が 32.83 ms で完了しました。
  HelloApi -> D:\git\cshaptest\HelloApi\bin\Release\netcoreapp3.1\HelloApi.dll
  HelloApi -> D:\git\cshaptest\HelloApi\bin\Release\netcoreapp3.1\publish\
```

```
HelloApi
│  appsettings.Development.json
│  appsettings.json
│  HelloApi.csproj
│  Program.cs
│  Startup.cs
│  WeatherForecast.cs
│
├─.vscode
│      launch.json
│      tasks.json
│
├─bin
│  ├─Debug
│  │  └─netcoreapp3.1
│  │      │  appsettings.Development.json
│  │      │  appsettings.json
│  │      │  HelloApi.deps.json
│  │      │  HelloApi.dll
│  │      │  HelloApi.exe
│  │      │  HelloApi.pdb
│  │      │  HelloApi.runtimeconfig.dev.json
│  │      │  HelloApi.runtimeconfig.json
│  │      │
│  │      └─Properties
│  │              launchSettings.json
│  │
│  └─Release
│      └─netcoreapp3.1
│          │  appsettings.Development.json
│          │  appsettings.json
│          │  HelloApi.deps.json
│          │  HelloApi.dll
│          │  HelloApi.exe
│          │  HelloApi.pdb
│          │  HelloApi.runtimeconfig.dev.json
│          │  HelloApi.runtimeconfig.json
│          │
│          ├─Properties
│          │      launchSettings.json
│          │
│          └─publish
│                  appsettings.Development.json
│                  appsettings.json
│                  HelloApi.deps.json
│                  HelloApi.dll
│                  HelloApi.exe
│                  HelloApi.pdb
│                  HelloApi.runtimeconfig.json
│                  web.config
│
├─Controllers
│      HelloController.cs
│      WeatherForecastController.cs
│
├─obj
│  │  HelloApi.csproj.nuget.cache
│  │  HelloApi.csproj.nuget.dgspec.json
│  │  HelloApi.csproj.nuget.g.props
│  │  HelloApi.csproj.nuget.g.targets
│  │  project.assets.json
│  │
│  ├─Debug
│  │  └─netcoreapp3.1
│  │      │  HelloApi.AssemblyInfo.cs
│  │      │  HelloApi.AssemblyInfoInputs.cache
│  │      │  HelloApi.assets.cache
│  │      │  HelloApi.csproj.FileListAbsolute.txt
│  │      │  HelloApi.csprojAssemblyReference.cache
│  │      │  HelloApi.dll
│  │      │  HelloApi.exe
│  │      │  HelloApi.MvcApplicationPartsAssemblyInfo.cache
│  │      │  HelloApi.pdb
│  │      │  HelloApi.RazorTargetAssemblyInfo.cache
│  │      │  project.razor.json
│  │      │
│  │      └─staticwebassets
│  │              HelloApi.StaticWebAssets.Manifest.cache
│  │              HelloApi.StaticWebAssets.xml
│  │
│  └─Release
│      └─netcoreapp3.1
│          │  HelloApi.AssemblyInfo.cs
│          │  HelloApi.AssemblyInfoInputs.cache
│          │  HelloApi.assets.cache
│          │  HelloApi.csproj.FileListAbsolute.txt
│          │  HelloApi.csprojAssemblyReference.cache
│          │  HelloApi.dll
│          │  HelloApi.exe
│          │  HelloApi.MvcApplicationPartsAssemblyInfo.cache
│          │  HelloApi.pdb
│          │  HelloApi.RazorTargetAssemblyInfo.cache
│          │
│          └─staticwebassets
│                  HelloApi.StaticWebAssets.Manifest.cache
│                  HelloApi.StaticWebAssets.xml
│
└─Properties
        launchSettings.json
```

# IISの有効化

Windowsの機能を開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/bc9acb39-9f8e-2f07-b3e0-3a059bddae72.png)

「インターネット インフォメーション サービス」にチェックを入れる。

![IIS有効.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/be190cc2-9b5a-c90e-736f-91d6de06e150.png)

# .NET Core ホスティング バンドル インストール

dotnet-hosting-3.1.1-win.exeを実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/2e66f464-fd63-65b0-0a1e-244eb7ed7617.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/610ef38b-b293-00e1-e39e-c3d8ba5b170d.png)



**※dotnet-hosting-3.1.1-win.exeインストール後はIIS自体を再起動すること**

# IISにデプロイ

IIS起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/3fd0ba25-f582-d62b-0eec-0f8bed05ca0e.png)

## Webサイトの追加

「サイト」で右クリックして「Webサイトの追加」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/8c546984-a6d0-b562-2943-5b4e7464f666.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/d7dd6875-3a0a-51ad-e52c-1ec285ee27e5.png)

物理パスは`dotnet publish`したときのpublishフォルダを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/5da48122-3cee-6711-cc5c-951daf4ab088.png)

http://localhost:8017/api/hello

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/36fb5537-bf7d-f87d-4271-04ba69691f68.png)

---

# 注意

* IISにデプロイしてもアクセスできない場合はIIS自体の再起動を忘れていないか確認。

# 参考

https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-web-api?view=aspnetcore-3.1&tabs=visual-studio-code
https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/publish-to-iis?view=aspnetcore-3.1&tabs=visual-studio
https://qiita.com/rawr/items/85abf5f646e20e3438a1
https://qiita.com/pieceofwonder/items/d091744193de86682712
https://qiita.com/pieceofwonder/items/d091744193de86682712