WebRole に Silverlight アプリケーションを WCF サービスをホストさせ、この2つ間のデータのやり取りにサービス参照を使用する場合の注意点。
サービス参照でプロキシを生成すると、構成ファイルに記述されるエンドポイントのアドレスは開発時の環境ものになってしまいます。
<client> <!-- address が localhost になっている --> <endpoint address="http://localhost:49538/SampleService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISampleService" contract="ServiceReference1.ISampleService" name="BasicHttpBinding_ISampleService" /> </client>
これを Windows Azure 上で動かす場合、普通に Client を生成してサービスを呼び出そうとすると例外が発生します。
var client = new ServiceReference1.SampleServiceClient(); client.Hello(); // 呼び出すときに例外が発生する!!
構成ファイルに記述されたエンドポイントにアクセスしようとしているのが原因です。
なので、Silverlight アプリケーションをホストしている Web ページの URL をもとにサービスが公開するエンドポイントのアドレスを求める必要があります。
var binding = new BasicHttpBinding(); var address = new EndpointAddress( new Uri(Application.Current.Host.Source + "/../../Service/SampleService.svc")); var client = new ServiceReference1.SampleServiceClient(binding, address); client.Hello();
具体的には、Application.Current.Host.Source の値を基準に、.svc ファイルのアドレスを求めます。
.svc ファイルの場所は WebRole プロジェクト内での xap ファイルからの相対位置を指定すれば OK です。