証明書ファイルを読み込んで WCF の SSL over TCP で使う

WCF は NetTcpBinding を使う場合でも SSL で通信を暗号化できる。

暗号化に使う SSL 証明書は、Windows の証明書ストアにインストールしてある中から検索して使うのが一般的なやり方っぽいが、 インストールしていない証明書のファイルを読み込んで使うことも可能。

コードはこんな感じ。WCF サービスをセルフホストするのに、Topshelf を使っている。

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
using Topshelf;

namespace WcfSample.Service
{
    class Program
    {
        static void Main(string[] args)
        {
            HostFactory.Run(config =>
            {
                config.Service<ServiceHost>(service =>
                {
                    service.ConstructUsing(settings =>
                    {
                        var certPath = Path.Combine(
                            AppDomain.CurrentDomain.BaseDirectory,
                            "cert",
                            "certfile.pfx");

                        // 証明書ストアに証明書が一時的に格納されるので、
                        // 格納場所を指定しておかないとデフォルトの場所に格納されてしまう。
                        // その場合管理者権限が必要になってしまうので、
                        // 現在のユーザーのストアに格納するように指定した。
                        var cert = new X509Certificate2(certPath, "password", X509KeyStorageFlags.UserKeySet);

                        var host = new ServiceHost(typeof(SampleService));
                        host.Credentials.ServiceCertificate.Certificate = cert;
                        return host;
                    });
                    
                    service.WhenStarted(host => host.Open());

                    service.WhenStopped(host =>
                    {
                        host.Close();
                    });
                });

                config.RunAsNetworkService();
                config.SetDescription("WCF サンプルサービス");
                config.SetDisplayName("WCF サンプルサービス");
                config.SetServiceName("WcfSampleService");
            });
        }
    }
}

アプリケーション構成ファイルも載せておく。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="SampleServiceTcp">
                    <security mode="Transport">
                        <transport clientCredentialType="None" protectionLevel="EncryptAndSign" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <services>
            <service name="WcfSample.Service.SampleService">
                <endpoint address="net.tcp://localhost:808/SampleService" binding="netTcpBinding"
                    bindingConfiguration="SampleServiceTcp" contract="WcfSample.Common.ISampleService" />
            </service>
        </services>
    </system.serviceModel>
</configuration>

アンリ・シャルパンティエ

大丸地下2階に出店している『アンリ・シャルパンティエ』でケーキを買って帰った。 ここの『Wチーズケーキ』は食べたことがあるけど、 今回のお目当ては『ミルクレープ』と『ザ・ショートケーキ』の2つ。

『ミルクレープ』は層が細かくて見た目が美しい。 間に挟まっているのは、ただの生クリームでは無い気がする。 クリームチーズが入っているのかもしれない。 究極のミルクレープというだけあって美味かった。

『ザ・ショートケーキ』は粒の大きな苺が3つものっていて見た目が豪華。 スポンジの間のクリームの層にもたくさん。 店で売っているショートケーキで、こんなに苺が使われたものは初めてだ。 こちらも生クリームが美味い。 今まで食べたショートケーキの中で1・2位を争う美味さだった。

どちらのケーキも期待以上で大変満足。 ケーキ2つで1000円オーバー、 ショートケーキにいたっては過去最高の値段だったけど、 それだけ払ってでもまた食べたいと思える味だった。

関連ランキング:ケーキ | 天神南駅西鉄福岡駅(天神)天神駅

WCF サービスを Topshelf で Windows サービス化

はじめに

WCF サービスをセルフホストする場合、 Windows サービスを作ることになると思う。

本番環境で動かすときは Windows サービスでいいんだけど、 デバッグはコンソールアプリケーションの方が便利。 そのため、Windows サービスとコンソールアプリケーションのプロジェクトを両方作って保守している。 もちろんコードの大部分は共有しているが。

Topshelf 使えば手軽に Windows サービスを作れる上、 コンソールアプリケーションとしても実行できるらしい。 こいつを使えば2つのプロジェクトを保守する手間とオサラバできそうだ。 これは試してみる価値あるな。

github.com

Topshelf をインストール

Visual Studio の Package Manager Console で

> Install-Package Topshelf

を実行し、WCF サービスのプロジェクトに Topshelf をインストールする。

Topshelf を使って WCF サービスをセルフホスト

下記のようなサービスコントラクトとサービスクラスがあったとする。

namespace WcfSample.Common
{
    using System.ServiceModel;

    [ServiceContract]
    public interface ISampleService
    {
        [OperationContract]
        string GetServerName();
    }
}

namespace WcfSample.Service
{
    using System;
    using WcfSample.Common;

    public class SampleService : ISampleService
    {
        public string GetServerName()
        {
            return Environment.MachineName;
        }
    }
}

Topshelft を使えば、こんな感じで Windows サービス化できる。

namespace WcfSample.Service
{
    using System.ServiceModel;
    using Topshelf;

    class Program
    {
        static void Main(string[] args)
        {
            HostFactory.Run(config =>
            {
                config.Service<ServiceHost>(service =>
                {
                    // エンドポイントの設定はアプリケーション構成ファイルで行うことを想定しているので
                    // ここでは設定していない。
                    service.ConstructUsing(settings => new ServiceHost(typeof(SampleService)));
                    service.WhenStarted(host => host.Open());
                    service.WhenStopped(host => host.Close());
                });

                config.RunAsNetworkService();
                config.SetDescription("WCF サンプルサービス");
                config.SetDisplayName("WCF サンプルサービス");
                config.SetServiceName("WcfSampleService");
            });
        }
    }
}

コンソールアプリケーションとして実行

作成した exe を普通に実行するだけ。

> WcfSample.Service.exe

Windows サービスとしてインストール

install サブコマンドが使えるようになっているので、

> WcfSample.Service.exe install

Windows サービスをインストールできる。

インストールしただけでは開始されていないので、 start サブコマンドを使って

> WcfSample.Service.exe start

Windows サービスを開始してやる必要がある。

Windows サービスをアンインストール

uninstall サブコマンドも使える。 今回のサンプルなら

> WcfSample.Service.exe uninstall

でアンインストールできた。

おわりに

超簡単に WCF サービスを Windows サービスでホストできた。 この簡単さを経験した後だと、 もう Windows サービスのプロジェクトテンプレートを使いたいとは思えないな。 今まで仕方なく使っていたけど、もうやってられない。

16区のアイスクリームとシャーベット

薬院にあるフランス菓子16区はダックワーズで有名だけど、まだ残暑厳しいこの時期は焼き菓子よりもアイスでしょ。 用事で近くを通ったので、アイスクリームとシャーベットをそれぞれ1種類ずつ買ってみた。

アイスクリームは定番のバニラをチョイス。濃厚でクリーミー。バニラビーンズたっぷりで風味も豊か。

シャーベットはキャバイヨン・メロンにしてみた。なんと果汁55パーセント。本当にメロンを食べているみたいだった。

16区のアイスクリームはずっと食べてみたいと思っていて、高くつくけどFAXで6個入りを注文しようとさえ思っていたから、今回念願叶って満たされた。

関連ランキング:ケーキ | 薬院大通駅桜坂駅薬院駅

『Web API : The Good Parts』を読んだ

Single Page Application を作る場合、Web API も作ることになるので、勉強のために購入して読んでみた。 以下、感想と読書メモ。

1章 Web APIとは何か

Web APIJSON over HTTP とも言える。REST API とは呼ばない。

Web API を提供する対象として、未知のたくさんの開発者(LSUDs)と既知の小数の開発者(SSKDs)がある。大半のアプリは SSKDs が対象になるだろうな。今作っている Web API もそう。

2章 エンドポイントの設計とリクエストの形式

Web API のエンドポイントの設計は REST と同じ。 ただ、単語をつなげるときアンダースコアを使っていた。 ホスト名と揃えるならハイフンの方が確かに良いかもしれない。

3章 レスポンスデータの設計

レスポンスデータは JSON で返すとして、API で配列を返したいときに配列のまま返すか、 オブジェクトでラップするかは悩む。

オブジェクトでラップすれば

  • JSONJavaScript として読み込んだときに構文エラーになるから JSON インジェクション防止になる
  • ページングする場合に次のページがあるかどうかといった情報も含めることができる

というメリットはあるけど…。自分の中ではまだ結論が出ていない。

4章 HTTPの仕様を最大限利用する

Web API が返すレスポンスのステータスコード

  • 成功したら 200 番台
  • クライアントが原因のエラーなら 400 番台
  • サーバー側が原因のエラーなら 500 番台

という風に HTTP の仕様にきちんと従う。 全部 200 を返してレスポンスボディにエラーコードを入れる、なんて行儀悪いことはしてはいけない。

独自の HTTP ヘッダーは定義することがあるかもしれないが、独自のメディアタイプの定義はやりすぎだな。 HTTP クライアントが対応していない可能性高いし。

5章 設計変更をしやすいWeb APIを作る

API バージョンはパスに入れる派だな。 パスに入れておけば使う側は必ずバージョンを指定することになるわけだから。

あと、API のバージョン管理はセマンティックバージョニングで。

オーケストレーション層は BFF (Backend For Frontend) と同じかな。 汎用的な Web API と、それをクライアントが使いやすい形に束ねて加工した Web API を提供する。 Web とモバイルみたいに、クライアントが増えてきたらやることになりそう。

6章 堅牢なWeb APIを作る

Web API も Web サービスなので、セキュリティは当然気をつけている。 XSSCSRFフレームワークがサポートしてくれるが、 パラメーターの改ざんだったり、大量アクセスへの対策は自前で作りこむ必要がありそうだ。

Web API: The Good Parts

Web API: The Good Parts

テックランチ

最近は夜に MacBook を開く時間が 30 分くらい確保できる日が増えてきた。まぁその時には疲れ切っていて、マンガやネットを見てしまうことがままあるのだけど。

IT コミュニティへの参加はまだまだ無理そう。平日夜や休日は子育て優先。唯一自由がきくのは平日の昼休みくらいだ。

その昼休みに先日、id:shunsuk 氏とランチをご一緒する機会があった。お互いの近況に始まり、テックな話からビジネス寄りの話までと、貴重な話が聞けて非常に有意義だった。

テックランチとでも言おうか。いろんな人とこういった時間を作れたらとは思うが、その繋がりをほとんど持っていないことが、最近の悩みだ。

『起業のファイナンス』を読んだ

起業やスタートアップへの参加は今のところ考えていないけど

  • ストックオプションがどういったものなのか
  • 発行株式の数はどうやって決まるのか
  • スタートアップの株価がどういう風に上がっていくのか

といったことに興味があったので読んでみた。

ストックオプションはあらかじめ決めておいた金額で株が買える権利と理解。 あらかじめ決めておいた金額よりも株価の方が高ければ、 権利を行使して株を買ってから売却することで、 その差額が利益になる、と。 株をもらえるわけではなかったんだね。

シリーズAやシリーズBといったシードラウンドで、 スタートアップの価値がどう評価されて株価が上がっていくのか。 また投資を受けることで株の保持率がどう変わるのか。 それらの流れが図表にまとめられていて非常に分かりやすかった。

発行する株式の数については見当たらなかったのでネットで調べた。 例えば資本金1000万の場合、 1株50000円にするなら200株、 1株500円にするなら20000株、 という風に1株の金額を小さくすれば発行する株式の数が増えていく。 株式分割も同じかな。

本書で得た知識を使う機会は今のところ無さそう。 ただ、将来どうなるかはわからない。 プライベートプロジェクトが軌道にのって起業、ってなればいいな。 そのときは再び本書を熟読することになるだろう。 知りたかったことはだいたい知れたので、 知的好奇心は満たされた。