2010年7月24日土曜日

WCFをSSLを介してSilverlightで使う

Silverlight4.0でSSLを介してWCFを使用したときに大変困った箇所を紹介する。1からの導入方法の紹介ではないので、それが必要な人は他のブログを参照して欲しい。


設定を行った環境は以下の通り。
Silverlight 4.0
WCF(このプロジェクトはIISにて仮想ディレクトリ化して動作させている)
IIS7
自己署名入り証明書
Windows 7 Pro 64bit


UAC
まず手始めとして、UAC(User Account Control)を無効にしたほうが良い。直接的には関係が無いのかもしれないが、UACを無効にせずに環境設定をおこなったらいつまでたっても動作しなかったものが、UAC無効化後に再度設定すると正常に動作しはじめた。特にWCFの仮想ディレクトリを作るところで違いがあるようだ。
How to Disable and Turn Off UAC in Windows 7


WCFの説明
Silverlightで開発をする場合サーバとの通信手段ではWCFを使用するのがスタンダードだ。しかし、このWCFが本当に優しくない。素人には大変厳しい仕様になっている。WCFは通信部分をすべて隠蔽してくれるので、サービスの参照の追加を行うとプロキシクラスを生成してくれて、クライアント側から簡単にサーバにアクセスできる手段を提供してくれる。しかし、この隠蔽が大変曲者だ。

プロキシクラスからサーバへリクエストを投げて何かしらの通信エラーが起こった場合、WCFはCommunicationExceptionを投げる。しかし、この例外、受け取るメッセージは常に一緒なのに要因は実に多岐に渡る。簡単に列挙するだけで下記の要因がある。

・Cross Domainエラーが発生している場合
・WCFのクライアント側の構成ファイルの記述に誤りがある場合
・証明書の設定が正しくない

ひとつひとつの要因が大きいのに、すべてCommunicationExceptionで包まれているので初見ではまったく意味が分からない。ここでは参考になったブログポストを紹介しておくので同じ現象にはまっている人は参考にして欲しい。

Network Security Access Restrictions in Silverlight
Making a Service Available Across Domain Boundaries
Cross Domainエラーが発生する場合は、inetpub/wwwrootの直下にclientaccesspolicy.xmlかcrossdomain.xmlを配置する必要がある。その両ファイルの背景と構成の説明。かなり長いので必要な箇所だけ拾い読みしてほしい。

Configuration Editor Tool (SvcConfigEditor.exe)
ServiceReferences.ClientConfigを編集するツール。記述に間違いがあるとエラーを出力するので、エレメントのチェックにも使える。

How to Set Up SSL on IIS 7
IISにSSLを設定する方法。真ん中から下以降を参考に。

IIS関連
Silverlight application running on FF gets CommunicationException during accessing a web using WCF through SSL, but not IE nor Chrome
IEとChromeでは動作するのにFireFoxだけCross Domainエラーを出力する場合に参考にしてほしい。


CommunicationExceptionでつまる原因は大体上記に当てはまると思うので、サーバに正常にアクセスできない場合は前述のブログポストを参考に対処してもらいたい。

0 件のコメント:

コメントを投稿