2008/06/21 - Silverlightソケット通信の質問

Silverlightで通信ができないというメールが来た。どうやらSilverlight 2 Beta 1からBeta 2になったときに仕様が変わったとのこと。ローカルPCにSilverlightのコンテンツを置いておいてローカルPC上のサーバにアクセスする際にも,クロスドメインポリシーを考慮しなければならなくなったらしい。どこがクロスだよ,って気もするけど。

早速実験してみる。Silverlight Tools Beta 2を入れる場合,Beta 1のアンインストールが必要なのだが,普通にアンインストールしただけではだめで,更新プログラムの一覧からKB949325を直接消さないといけないというのにはまりつつ,インストール完了。微妙にWatermarkedTextBoxが消えてたりするのに困りつつ実験開始。

確かに以前と同じコードでSocket通信すると,AccessDeniedになってしまう。ということでクロスドメインポリシーサーバをたててみる。FlashのSocket通信のときに同じようなことをやってたのでほぼ流用。ポート943で,「<policy-file-request/>」という文字列を受信したら以下のような文字列を送信するサーバをたてればOK。許可ドメインはちゃんと絞り込まないといけないけど。

<?xml version="1.0" encoding ="utf-8"?>
<access-policy>
 <cross-domain-access>
  <policy>
   <allow-from>
    <domain uri="*" />
   </allow-from>
   <grant-to>
    <socket-resource port="4502" protocol="tcp" />
   </grant-to>
  </policy>
 </cross-domain-access>
</access-policy>

結局,Socket通信は以下のような感じになる。

  1. Silverlightクライアントからサーバの943ポートへ,フレームワークが勝手に「<policy-file-request/>」を送信する
  2. サーバの943ポートからSilverlightクライアントへ,クロスドメインポリシーを返信する
  3. Silverlightクライアントからサーバの4502-4532ポートへ通信

コメントする