xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

OWINセルフホストのサービスを外部公開する

ASP.NET 5 が OWIN を互換レイヤーとしてサポートすることを決定したということで、OWIN is dead などという記事を書いたわけですが。率先して選ぶことは減ってきているのかもしれませんが、そうは言っても OWIN は (一応) 現役です。

OWIN の良いところのひとつにセルフホストがあります。ホスティング環境を抽象化し、System.Web.dll (= IIS 強依存) からの脱却に成功して注目されたアレです。先日 @masayan_kazu さんから SignalR についての相談を受け、セルフホスティングについて解説したのですが、「セルフホスティングで構築したサービスを別 PC から参照したい」という要望も後に受けました。今回はその時に知った方法を。

1. 公開 URL を指定する

セルフホスティングに関する記事を読んでいると、大抵の場合 http://localhost:8080 のような localhost 向けの URL が指定されています。ループバックを示す設定なので、このままでは自分自身からしかアクセスできません。何とか自分に付与されている IP アドレスでサービスを公開したいわけですが、それは以下のようにします。

[STAThread]
static void Main()
{
    using (WebApp.Start("http://+:8080"))
    {
        //--- 省略
    }
}

localhost の設定を + に書き換えるのがポイントです。

2. 管理者権限で実行する

URL は先の設定で OK なのですが、そのまま起動しようとすると TargetInvocationException が飛びます。これを回避するためにはアプリケーションを管理者権限で実行する必要があります。手っ取り早く app.manifest に以下の設定を入れましょう。

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <!-- 実行時に管理者権限を要求 -->
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

Visual Studio でデバッグ実行をする際は、Visual Studio 自体も管理者権限に昇格させる必要があるので注意が必要です。(先のマニフェストの設定を入れれば、デバッグ実行時に管理者権限への昇格を要求されます)

3. 通信ポートの解放

最後にファイアーウォールの受信/送信規則に通信用のポートを解放する設定を入れます。試したところ、ファイアーウォールの設定はサービス公開側でのみ行えば良さそうです。