以下、vistaでのお話です。そう、管理者権限ってやつですね。
VS2008のWCFサービスライブラリというテンプレートからWCFサービスを作成し、F5(デバッグ開始)を押して動作させると、何の問題もなくWCFサービスホストが起動し、WCFテスト用クライアントが自動的にWCFサービスを見つけてくれる。
ところが、テンプレートを使わずに自力でプロジェクトを作成した場合は、以下のメッセージが出てWCFサービスホストがエラー状態で起動してしまう。
「HTTP は URL http://+:8000/HogehogeService/ を登録できません。プロセスにこの名前空間へのアクセス権がありません」
これを解決するには、VS2008を管理者権限で実行すれば良いと以下に書いてある。
チュートリアル入門のトラブルシューティング
http://msdn.microsoft.com/ja-jp/library/bb924513.aspx
確かにこれでうまく行く。でもちょっと待てよ。WCFサービスライブラリのテンプレートから作成したプロジェクトは管理者権限で実行しなくてもうまく動くじゃない。なぜ? と思ったあなたは偉い! 自分は思った。(自画自賛かw)
でさらに調べてみると、上記のリンク先に以下のように書いてある。
「詳細については、「HTTP および HTTPS の構成」を参照してください」
というわけでそこを見ると、以下のように書いてある。
「
Running Windows Vista
If you are running on Windows Vista, you can use the Netsh.exe tool instead. The following shows an example of using this command.
netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\user
」
あと、
WCF 開発ツールの使用
http://msdn.microsoft.com/ja-jp/library/bb552361.aspx
にも以下のように書いてある。
「
管理者特権を必要としないツールの使用
管理者特権のないユーザーが WCF サービスを開発できるようにするために、Visual Studio のインストール時には、名前空間 "http://+:8731/Design_Time_Addresses" に対してアクセス制御リスト (ACL: Access Control List) が作成されます。この ACL は (UI) に設定され、コンピュータにログオンしているすべての対話ユーザーが含まれます。管理者は、この ACL にユーザーを追加または削除したり、追加のポートを開いたりできます。この ACL によって、既定の構成で、WCF テンプレートまたは WF テンプレートでデータを送受信できるようになります。また、ユーザーは、管理者特権が付与されていなくても、WCF サービスの自動ホスト (wcfSvcHost.exe) を使用できるようになります。
システム特権のある管理者アカウントで Windows Vista の Netsh.exe ツールを使用すると、アクセスを変更できます。Netsh.exe の使用例を次に示します。
netsh http add urlacl url=http://+:8001/MyService user=\
Netsh.exe 詳細については、 、「Netsh.exe ツールとコマンド ライン スイッチの使用方法」を参照してください。
」
なるほど。特定のユーザーに特定のポートへのアクセスを許可すれば良いのね。というわけで、コマンドプロンプトを管理者権限で実行し、以下のコマンドを打って解決した。
C:\Windows\system32>netsh http add urlacl url=http://+:8000/HogeHogeService user=Fuga\MogeUser
「URL 予約を正常に追加しました」
と表示されればOK。どうてもいいけど「追加しました」の後に句点(。)はない。
ちゃんと登録されたかどうか、一応、以下のコマンドで確かめてみよう。
C:\Windows\system32>netsh http show urlacl
ちなみに間違えて登録しちゃった場合は、以下のようにして消せる。
C:\Windows\system32>netsh http delete urlacl url=http://+:8000/HogeHogeService
「URL 予約を正常に削除しました」
と表示されればOK。どうてもいいけど「追加しました」の後に句点(。)はない。(天丼かw)
ところで、http://+:8000みたいに書いてたけど、+って何だろう? Strong Wildcardのようですね。
UrlPrefix Strings
http://msdn.microsoft.com/ja-jp/library/aa364698(en-us,VS.85).aspx
で、ようやく結論。タイトルの
「VS2008のテンプレートで作成したWCFサービスライブラリは、なぜ管理者権限で動作させなくても良いのか?」
の答えは、上記でnetshを使ってURL予約を作成したように、VS2008が自動でURL予約を作成してくれているからのようです。
netsh http show urlacl
でURL予約の一覧を表示してみると、その中にちゃっかり作成されているのを確認することができました。