ASP.NET Core のチュートリアルをやってみた

# はじめに

自宅のWindowsマシンにIISとSQLServer2014ExpressをインストールしてASP.NETのアプリを稼働させていただものの、

そのマシンが再三の電源断(エアコン&電子レンジ&トースターコンボによるブレーカー落ち)に見舞われ、システムのロールバックが発生。

結果、データは残ったものの環境が綺麗さっぱりなくなりました。

ということで、さくらのクラウドクーポンもあるし、クラウドへ移行することに決め、

.NET Core, ASP.NET Core をやってみようとまずはチュートリアルをやってみてそれを記録していきます。

途中まで順調だったものの、開発環境(Windows)から実行環境に(CentOS)に乗せて実行した時にトライ&エラーがありました。


***

# 環境等

## 開発環境

1. Windows 10 Home 64Bit

1. Visual Studio Community 2015

1. Git(SourceTree)

## 実行環境

1. さくらのクラウド(1CPU,1GB,20GB HDD)

1. CentOS 7.2 64Bit

1. .Net Core環境は構築済み

    1. DotNetCoreのインストール [オフィシャル](https://www.microsoft.com/net/core#linuxcentos)

    1. ASP.NetCoreのプロジェクト作成 [オフィシャル](https://docs.microsoft.com/en-us/aspnet/core/getting-started)

***

# チュートリアル開始
オフィシャルのチュートリアルに沿って進めます。
開発環境の`Visual Studio Community 2015`でやります。

1. まずはプロジェクトの作成と起動

    [Getting started with ASP.NET Core MVC and Visual Studio](https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/start-mvc)

    1. `ASP.NET Core Web Application(.NET Core)`の新規プロジェクト作成

    1. そしていきなり`Ctrl+F5`で起動！

    1. 何事もなく表示される

1. 次。Controller

    [Adding a controller](https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/adding-controller)

    1. Controllerクラスを追加

    1. メソッドを2つ追加。Index,Welcome

        1. Indexはデフォルト参照される

        1. WelcomeはPath指定したら参照される

        1. よくあるやつ `/[Controller]/[ActionName]/[Parameters]`

    1. で、その定義が`Startup.cs`に定義されてますよってことみたい

        1. `template: "{controller=Home}/{action=Index}/{id?}");` で指定

        1. ASP.NETと同じです

    1. Welcome()にパラメータ追加しましょう
    
    1. … チュートリアルの内容を進めているだけなので、特に書くことない …

# 実行環境(CentOS)で動かしてみる

画面が表示される状態になってちょっとだけ修正したので、CentOS上にリリースして動かしてみましょう！
ということでここからは、さくらのクラウドで稼働しているCentOSでやります。

1. 実行してみる

    1. `dotnet restore` 問題なし。

    1. `dotnet run` コケた。

        > $ dotnet run
        > Project helloAspDotNetWebApp (.NETCoreApp,Version=v1.0) will be compiled because the version or bitness of the CLI changed since the last build
        > Compiling helloAspDotNetWebApp for .NETCoreApp,Version=v1.0
        > 
        > Compilation succeeded.
        >     0 Warning(s)
        >     0 Error(s)
        > 
        > Time elapsed 00:00:02.5178875
        > 
        > 
        > The specified framework 'Microsoft.NETCore.App', version '1.0.1' was not found.
        >   - Check application dependencies and target a framework version installed at:
        >       /opt/dotnet/shared/Microsoft.NETCore.App
        >   - The following versions are installed:
        >       1.1.0
        >   - Alternatively, install the framework version '1.0.1'.
        
        どうやら、`Microsoft.NETCore.App`の開発環境と実行環境バージョンが一致してないらしい。
        実行環境は`1.1.0`らしいので開発環境をバージョンアップしなければ。

    1. VisualStudioのNuGetパッケージマネージャから更新

        1. ほんとだ、現在は`1.0.1`だ… さっき作ったのになんで最新じゃないんだっけ

        1. とりあえず開発環境のNuGetパッケージマネージャで更新

    1. 更新できたのでLinux側で再チャレンジ

        1. `dotnet restore`

        1. `dotnet run` …コケた…

            > $ dotnet run
            > Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'centos.7-x64'. Possible causes:
            > 1. The project has not been restored or restore failed - run `dotnet restore`
            > 2. The project does not list one of 'centos.7-x64' in the 'runtimes' section.
            > 3. You may be trying to publish a library, which is not supported. Use `dotnet pack` to distribute libraries.

            これは… うーん、ターゲットランタイムはcentos.7-x64と互換ないっすよ。と… .NET Core なのに互換ないとかなんてことだ！

            とりあえず開発環境ですべてのNuGetパッケージを更新してみる。全部で3回更新してやっと全部更新完了。

            で、再チャンレジしたけどダメ…

            1. ググってたらこんな情報見つけた。

                [C# で AWS Lambda を使う](http://qiita.com/creativewebjp/items/be182b394f5c56c24485)

                > ランタイムに centos.7-x64 と指定すると発行ができるようになります。

                `dotnet publish --configuration Release --runtime centos.7-x64`

                ん～、だめ。

                    ※ 動いたあとでよく見たらちゃんと`project.json`にruntimeブロックが追記されていました。ちゃんと読まなきゃだめですね…

            1. さらにこんな情報を見つけた。

                [In my project.json I added the following section:](http://stackoverflow.com/questions/37590604/can-not-find-runtime-target-for-framework-netcoreapp-v1-compatible-with-one-of)

                `project.json` にruntimeセクション追加して、そこで`centos.7-x64`を指定しろ。

                ってことなんだけど、これは上でやっていることとほとんど同じだからダメだろ… と思ってやってみたら、キタコレ！

                これで起動するということはランタイム指定ができていれば良いということ。

                つまり、dotnetコマンドのruntimeオプションが効いてない？


            1. dotnetコマンドのリファレンス確認

                [dotnet-run](https://docs.microsoft.com/en-us/dotnet/articles/core/tools/dotnet-run)

                これによると、`--runtime`っていうオプションは記載されてない。

                でも、コマンド実行した時にエラーにならないの？試しに…

                `dotnet run -hoge`

                `dotnet run --hoge`

                hogeパラメータは完全に無視されて普通に動いた…

                やっぱり、オプションによるruntime指定はできない。`project.json`のruntimeセクションで指定する必要がある。が正解みたいだ。

                下記が`project.json`に追記した内容。

                ```json
                "runtimes": {
                  "centos.7-x64": { }
                }
                ```

今日はここまで！続きはまた今度！