ものがたり(旧)

atsushieno.hatenablog.com に続く

moonlight開発小話: ServiceReferences.ClientConfig

この前もちらっと書いたけど、最近Moonlightの開発に少しシフトしている。というか、それにかこつけてWCFの開発に引き戻されているような気がしなくもないけど。ともあれ、そんなわけで、開発中に見つけたちまちました話をたまに書いてみようと思う。

そんなわけで今日はSilverlightWCFのconfigurationの話だ。

SL2に含まれるWCFは、.NET 3.0に含まれるWCFの大部分を含んでいない。特に、IdentityModelと、それに依存する全てのセキュリティスタック(CardSpaceなど)が消えて無くなっている。そしてサービスサイド(ServiceHostとか)は無関係なので、ばっさり落ちている。

もう一つ膨大なパートが消えて無くなっている。configurationのサポートだ。System.Configuration.dllが存在しないのだから、サポートもしようがない。僕は(大昔にid:atsushieno:20070206でも書いたけど)このconfigurationというものが気に入らないので、これは実のところ喜ばしいことだった。

しかし最近報告されたWCFのアプリケーションの不動作を検証していくうちに気付いたのだけど、ChannelFactoryやClientBase<T>には、未だにconfigurationを前提としているようなコンストラクタがある。endpointConfigurationNameをとる奴は皆そうだ。何で何で? configurationって無いんじゃないの?…と思ってxapの中身を眺めていて、ServiceReferences.ClientConfigなるファイルがあることに気がついた。どうせVisual Studioのプロジェクトファイルの一部だろう、とたかをくくっていたのだけど、中を見ると、どうやらこれがServiceEndpointの設定に使われているらしい。何だよ、早く言えよ! (注: 書いてあります

そんなわけで、このconfigファイルを処理するコードをどうするか考えたのだけど、System.ServiceModel.Configurationのクラスを選んでビルドに組み込むなんてあり得ない(そもそもベースになるSystem.Configuration.dllが存在しない)。となると自分で解析するしかない。幸いにしてXLinqはSL2でも使えるじゃないか。そう思ってとりあえずXLinqを使ってこのXMLを解析するコードを手書きで作って、無事読めるようになった。

で、いざビルドに入れようとしたらSystem.Xml.Linq.dllが無いと言って怒られる。ここでようやく気がついた。XLinqはSDKアセンブリだから、ランタイムのビルドには含まれていないのである(まあそもそもビルドしていないけど)。しかもSystem.ServiceModel.dllはランタイムアセンブリだから、その中でSDKアセンブリを参照するわけにはいかない。XLinqサポートのコードは、かくしてお蔵入りになり、結局XmlReaderを使うコードを書き直すことになるのだった。

教訓: SDKアセンブリとランタイムアセンブリの違いには気をつけるorz

次は気が向いたら今ハメられているWebClientの話でも書くかも。