初めまして。
キャスレーコンサルティング SI(システム・インテグレーション)部の高田です。

普段Javaばかりで他の言語に触れていなかったので、
今まで触った事のない.NET Coreという環境で、ASP.NET Core の勉強をしてみようと思います。

今回はWindowsで”Hello World!”を表示するWebサイトを作成して、仮想環境のLinuxで動かす環境を作ってみました。

まず、.NET CoreとASP.NET Coreについての説明をさせていただきます。

.NET Core、ASP.NET Core とは

.NET Core

.NET Coreとは、2016年にリリースされたMicorsoft社が提供するクロスプラットフォームの.NET環境です。

Microsoft社提供の.NET環境と言えば、みんな大好き.NETFrameworkがありますが、
.NET Coreは.NET Frameworkとは異なり、WindowsだけではなくLinux・Mac上での動作をサポートする.NET環境です。
※Mono を用いる事で.NETFrameworkの互換環境をLinux・Mac上に構築する事は可能です。
弊社記事「LinuxでもC#プログラミング(導入編)」にて紹介しておりますので、ご参照ください。

また、.NET CoreはGitHubでオープンソース化されており、自分でビルドしたり、プル要求を出すことが可能です。
プル要求の承諾にはMicrosoft社の審査を通る必要がありますが、自分で考えたものが動作するというのは感動ですね!

ASP.NET Core

ASP.NET Coreとは、2016年にリリースされたMicrosoft社が提供するWebアプリケーション用フレームワークです。
こちらも.NET Core同様に、クロスプラットフォームで動作し、オープンソース化されています。

環境としては、.NETFramework・.NET Coreの双方を選択可能です。

ASP.NET CoreはKestrelというWebサーバを内包しており、従来のASP.NETのようにIISに依存しません。

内部ネットワークでの運用であればKestrel単品で動作しますが、
外部に公開する場合はIIS、Nginx、または、Apacheをリバースプロキシとして立てる必要があります。

WindowsではIIS、LinuxではNginxを使用する事が多いです。

環境構築

下記構成で環境を作成していきます。
・Windows7
・Visual Studio Community 2017
・Oracle VM VirtualBox (仮想化ソフトウェア)
・Ubuntu 16.04 (仮想環境)
・WinSCP

1.プロジェクト作成

VisualStudioのテンプレートプロジェクトの中にある”Hello World!”を出力するWebサイトプロジェクトを作成します。

1.メニューの「ファイル(F)」→「新規作成(N)」→「プロジェクト(P)」を押下
2.「新しいプロジェクト」ウィンドウにて「インストール済み」→「テンプレート」→「Visual C#」→「Web 」を押下
テンプレートが表示されるので「ASP.NET Core Web アプリケーション (.NET Core)」を選択して、OKボタン押下
3.「新しい ASP.NET Core Web アプリケーション (.NET Core)」ウィンドウにて「空」を選択して、OKボタン押下

これで作成完了です。

ソリューションエクスプローラーに下図のようなものが表示されていると思います。

asp_1

プロジェクトを作成するとソースファイルが出力されます。
出力されたソースファイルを見ていきます。

まずはProgram.csです。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace WebApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .Build();

            host.Run();
        }
    }
}

ASP.NET Coreは、コンソールアプリと同様にMainメソッドが定義されております。
後ほど記載しますが、ASP.NET Coreはコンソールからコマンドを叩いて実行します。
その際、最初に実行されるのがこのメソッドです。

このProgram.csのMainメソッドでは、ASP.NET Coreを動かすのに必要なホストを構成した後、起動しています。

今回は、Linux上で動作させるので
17行目のUseIISIntegrationメソッド(IISとの統合動作設定を行うメソッド)を削除します。

また、この状態では外部からのリクエストを受け付けるポートが未設定の為、localhost以外から接続出来ません。
UseUrlsメソッドを実行して、localhost以外からも接続できるようにURLを設定します。

        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .UseUrls("http://*:5000")
                .Build();

            host.Run();
        }

続いて、Startup.csです。

これは先程のProgram.csのホスト構成にて、
UseStartupメソッドでスタートアップに指定したクラスのソースファイルです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace WebApplication1
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

今回は何もしていませんが、ConfigureServicesメソッドはDI経由でサービスクラスを使えるようにする為に、
コンテナへサービスクラスを登録します。

ConfigureメソッドはHTTPリクエストへのレスポンスを設定します。

このStartup.csでやっている事はシンプルで
26~29行目で開発環境であれば詳細なエラー情報の表示設定をした後、
31~34行目でリクエストに対して”Hello World!”をレスポンスするのみです。

2.ポートフォワーディング設定

Windowsから仮想環境のUbuntuへWebブラウザ(http)、
WinSCP(ssh)で接続する為にポートフォワーディングを設定します。

1.VirutalBoxに作成した仮想マシンの設定にて、「ネットワーク」→「アダプター1」タブの「割り当て(A)」を
「NAT」に設定後、「高度(D)」メニューを開き「ポートフォワーディング(P)」ボタン押下
(補足) NAT(Network Address Translation) とは  (Wikipediaより)
インターネットプロトコルによって構築されたコンピュータネットワークにおいて、
パケットヘッダに含まれるIPアドレスを、別のIPアドレスに変換する技術である。

2.「ポートフォワーディング ルール」ウィンドウの右上にあるプラスマークのアイコンを押下して
アイテムを2つ追加それぞれ下図の様に設定

asp_2

3.Ubuntuを表示・ログインして下記コマンドを実行し、sshパッケージをインストール(httpのインストールは不要)

sudo apt-get update
sudo apt-get install ssh

3.Ubuntu に .NET Core をインストール

Ubuntu に .NET Core をインストールします。
1.下記コマンドを実行し、Ubuntuに鍵情報を登録

sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys B02C46DF417A0893
sudo apt-get update

2.下記コマンドを実行し、.NET Coreをインストール

sudo apt-get install dotnet-dev-1.0.4

4.動作確認

先ほどVisualStudioで作成したテンプレートプロジェクトを発行し、Ubuntuに転送して動作確認を行います。

まずはVisualStudioで作成したテンプレートプロジェクトのWebサイトを発行します。

1.ソリューションエクスプローラーでプロジェクトを右クリックし、「発行(B)」を押下
2.下図の様な発行ウィザードが表示されるので「フォルダー」を選択し、「発行」ボタン押下

asp_3

発行が終わったらWinSCPでUbuntuに接続して、作成したファイルを転送します。
発行時に指定したフォルダ配下の全ファイルを任意のフォルダに転送してください。

asp_4

転送が終わったら、Ubuntuにて転送先フォルダに移動して下記コマンドを実行し、アプリを起動します。

dotnet WebApplication1.dll

このコマンドではWebサイトの発行時に作成したdllファイルを実行しています。

ファイル名はプロジェクトのプロパティで設定する「アセンブリ名」になります。
「アセンブリ名」の初期値にはプロジェクト名が設定されますが関連はしていません。
プロジェクト名と別名にする場合はWebサイト発行前に変更してください。

終了させる時は、Ctrl + c キーを入力してください。

Windows側のWebブラウザからUbuntuに接続して”Hello World!”と表示されれば完了です。
asp_5

所感

Linux運用において主流になるであろう Windowsで開発 → Linuxで実行 についての実験をしてみましたがいかがでしたか。
私個人としましては、Linux上で.NETが動くということにちょっとした感動を覚えました。

今回はVisualStudio(Windows)でプロジェクトを作成しましたが、Linux上でもコマンドでプロジェクトを作成可能ですし、
VisualStudioCodeというクロスプラットフォームのエディターに拡張機能をインストールすればデバッグも行えます。

.NET Coreは次期バージョンのリリースも予定されており、これから盛り上がっていくのではないかと予想しています。
(高田個人の予想です。)
今回私が紹介させていただいた内容に、皆さんが参考にできる情報が含まれていれば幸いです。

以上、お付き合いいただきありがとうございました。

参考

https://www.microsoft.com/net/core#linuxubuntu
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/hosting
https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/index
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup