読者です 読者をやめる 読者になる 読者になる

XML-RPC.NETの微妙なところについて

.NET での XML-RPC の実装として XML-RPC.NET というのがあります。結構、有名なライブラリらしく、クライアントとサーバーの両方に対応しています。ちょっと、XML-RPC でやり取りするサーバーの実装を作る必要ができたので使ってみました。

XML-RPC の Struct が .NET の Struct しか対応してなかったり、 XML-RPC の Array が .NET の Array しか対応してなかったり(ややこしい)、int が int32 しか対応してなかったりと、型のサポートの少なさはちょっとどうかなと(特に Struct)思います。まぁ、直前で対応する型に変換してやれば大きな問題は無いでしょうが。

ということで、使えるかなぁと思ってたのですが大きな問題を発見してしまいました。こりゃ駄目です。

XML-RPC.NET はリモーティングにも対応しているみたいですが、 Web サービスとして HttpHandler から呼び出した場合に結果の XML の形式がご丁寧にインデントして整形されてました。。今回、ブラウザからこれを呼び出すものを作っているのですが、整形されているって事は、タブ文字や改行が入っていて Firefox でよみこむと、それらもエレメントとみなされます(Opera もかな?)。IE ではそこらへん寛大(良いか悪いかは別として)なので無視します。つまりブラウザ別に挙動を変える必要があるのです。

XML としては Firefox の認識が正しくなります。 IE の認識は間違っているのかと言われると正しくはありません(個人的には読み飛ばしてくれるのは扱いやすいので嬉しいのですが)。XML-RPC.NET はどうかというと、正しくありません。よく間違われることなのですが、 XML フォーマットはテキストフォーマットである前に XML フォーマットです(そのまんま)。つまりインデントなどがついていてテキストとして読みやすいかどうかよりも以前に、XML のフォーマット(正しくは InfoSet )が評価されます。エディタなどで文字列として書き出したときに見やすいか編集しやすいかなんて関係ありません。

ということで XML-RPC.NET のレスポンスをどうにかすることになるのですが、ソースを追いかけたところ定義ファイルとかで設定できなさそうで、ソースを直接いじるしかなさそうです。

かなり微妙・・・。自分で作ってしまおうかな・・・。