EmbedIO

皆さん、nodeでWebサーバ書いてますか? 書いてますよね。

めちゃくちゃ便利ですよね。

惰性でExpress使いますか?

めちゃくちゃ便利ですよね。

.NET CoreのC#でASPNet.Core使いますか?

ぶっちゃけ結構場合を選びますよね。

 

僕も結構躊躇します。

というのも、ちょっとのことをしたいのに、フルセットついてきちゃうというのがなかなかこれが。

デバッグはIIS Expressだったり、実際に動かすときはSelfHostedなLinux環境でだったりと、ほんとに悩みます。

少し前まではASPNetCoreのプロジェクトってやたらファイル数ありましたし。

大げさというか何というか。

 

そういうときに是非、と、今回紹介したいのは、EmbedIOというWebサーバです。

もちろんの事ながらNuGetパッケージもあります。

結構長い間使っていますが、ずっと開発が続いているので、持続的に使わせていただけそうなパッケージになってます。

ソースも読みやすいので、何かあっても巻き取れるかも。

 

で。

こいつの何が良いかと申しますと。

どう良いかは、コードを見ると説明すら不要かもしれません。

using System;

using EmbedIO;
using EmbedIO.Actions;
using Swan.Logging;

namespace EmbedIOTestCore31
{
    class Program
    {
        static void Main(string[] args)
        {
            var url = "http://localhost:9696/";
            if (args.Length > 0)
            {
                url = args[0];
            }
            using (var server = CreateWebServer(url))
            {
                server.RunAsync();
                Console.WriteLine("Press Any Key To Exit");
                Console.ReadKey(true);
            }
        }
        private static WebServer CreateWebServer(string url)
        {
            var server = new WebServer(o => o
                    .WithUrlPrefix(url)
                    .WithMode(HttpListenerMode.EmbedIO))
                .WithAction("/test", HttpVerbs.Get, ctx => ctx.SendStringAsync("Hello World", "text/plain", System.Text.Encoding.UTF8))
                ;


            server.StateChanged += (s, e) => $"WebServer New State - {e.NewState}".Info();
            return server;
        }
    }
}

どうですか皆さん、なんとなくソースから動きがわかりそうじゃないですか?

もちろん、直感的に理解いただけたと思いますが、これだけで、"http://localhost:9696/test"にアクセスすると"Hello World"が表示されます。

 

当然ながら、コントローラ的なクラスを作ってそれを使わせることも出来ます。

.WithAction("/test", HttpVerbs.Get, ctx => ctx.SendStringAsync("Hello World", "text/plain", System.Text.Encoding.UTF8))
.WithWebApi("/api", m => m.WithController<TestController>())
;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using EmbedIO;
using EmbedIO.Routing;
using EmbedIO.WebApi;
namespace EmbedIOTestCore31
{
    class TestController :  WebApiController
    {
        [Route(HttpVerbs.Any,"/")]
        public async Task<Object> Test()
        {
            await Task.Delay(1);
            return new { Hello = "world" };
        }
    }
}

なんと、こんな雑なコントローラで、

"http://localhost:9696/api/"からは'{"Hello": "world"}'が返却されます。

雑にObjectに対して匿名クラスを返していますが、ちゃんと型を指定することもできます。

 

これだけでも鬼のような便利さのEmbedIOですが、なんと。

Xamarinでも使える

実はこれ、Xamarinでも使えちゃうんです。

Xamarin.Formsでも、Xamarin.Androidでも。しかも、コードはそのまま。

ListenのURLだけ、127.0.0.1にしないといけないですが、後は全部普通に作れます。

究極のガワネイティブアプリですね。サーバサイドまでローカルに持ち込むという荒業です。もちろん、その中でLiteDBなんかも使い放題です。

 

ガワネイティブで作って、サーバ部分をEmbedIOで作っておけば、Windowsアプリを作るときも、ほぼ同じ方法でアプリを作ることができます。

EdgeHTMLのライブラリがObsoluteになり、新しいEdgeのライブラリを使用しないといけなくなるなど、今のところWindows環境はバタバタしていますが、これもいずれこなれるでしょう。その時に、WebView貼り付けた画面をポンと起動するだけになれば、相当楽だと思います。

極端なソリューションとしてはChromeがインストールされていれば、Chromeを"-app=http://localhost:9696/"で起動しちゃう、みたいな全部Chromeに頼り切ったものにしちゃうのも一つです。

その場合、案外割と強力なX-Platになるかもしれませんよ。

 

ぜひ皆さん一度EmbedIO、検討してみてください。