Community Open Day 2012 の補足その2

Community Open Day 2012 の補足その1 | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3504

の続き。

サンプルコード
win8/MetroMemoPadiPadLike at master ・ moonmile/win8 ・ GitHub
https://github.com/moonmile/win8/tree/master/MetroMemoPadiPadLike

を実行しようとすると分かるのですが、サーバーを実行する時にエラーがでます。これは、サーバーとして使っている HttpListener クラスを実行する権限…というか、サーバーのポートを開ける権限は Windows 8 では制限されているからなのです。Windows 7 でも制限されているので、IIS ではなくて、HttpListener を使う時には覚えておくとい良いテクニックです(って定番か?)。

■サーバーのポートを許可する

手っ取り早いのは、HttpListener クラスを使っているログサーバーアプリを「管理者権限」で立ち上げてしまうことです。実験をしているときはこれでよいのですが、ログサーバーアプリからファイルに書き込みをすると、Administrators になってしまうのでちょっと問題があります(一般ユーザーでファイルを消せなくなってしまうので)。

普通に起動した場合には、以下のようなエラーが出てきます。

という訳で、ポートの設定は、「netsh http add urlacl url=http://*:8083/metro/ user=masuda」のように予め空けておくという訳です。

■metroアプリのマニフェストの変更(機能の追加)

もうひとつ、ネットワークを使うときには設定が必要です。今回のメモ帳アプリからログサーバーにメッセージを飛ばす場合に、インターネットを使う場合には通常設定されている「インターネット(クライアント)」で十分なのですが、ローカルネットワーク(イントラネットワーク)を使う場合には、「自宅または勤務先のネットワーキング」というものにチェックをいれます。
いわゆる、「win8rp-pc」のようなローカルだけで通用するホスト名を相手にする場合は、別な設定が必要という訳です。ネットワークセキュリティにあわせてというところでしょう。

■Windows 8 上で、ログサーバーとメモ帳アプリを同時に動かす場合

更に云うと、Windows 8 上の metro アプリから、同じコンピュータにあるログサーバーにアクセスをする場合には、もうひとつ設定が要るのです。metro アプリを Visual Studio 2012 上でデバッグモードで動かしている場合は大丈夫なのですが、普通に metro アプリをインストールして動かそうとするとログサーバーにメッセージが飛ばないという現象です。

metro-desktop 間のループバックには CheckNetIsolation コマンドで設定する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3414

Windows 8 ではデフォルトで「ループバック」が不許可になっています。なので、metro アプリから同マシンで動いている desktop アプリ(この場合はログサーバー)にアクセスする場合には、特殊な設定が必要なのですね。

CheckNetIsolation.exe LoopbackExempt -a -n= パッケージファミリ名指定でループバックを許可

という形でパッケージファミリ名を使ってループバックを許可します。
パッケージファミリ名は、マニフェストの「パッケージ化」→「パッケージファミリ名」で取得できます。

ちなみに、パッケージ名は変更できるんですが、パッケージファミリ名は変更できません。Visual Studio 2012 が自動的に付加します。まぁ、どこかの設定ファイルに書かれていると思うのですが、ちょっと分かりませんね。パッケージ名を変更してもパッケージファミリ名は変更されないので、まあ、そういう仕様なのかと。

カテゴリー: C#, windows 8 パーマリンク