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、検討してみてください。