暇なのでXML-RPC.Netを試してみる日

新年一発目の仕事もプロトの作成が終わり、微妙に暇になった日(・∀・)
っというわけでは、ちょっと思いつきでXML-RPC.Netを使ってPHPとの相互接続を試してみたり。


まずはテスト用に、PHPPEAR::XML_RPCを使ってサーバ側の実装。

<?php
require_once( 'XML/RPC.php' );
require_once( 'XML/RPC/Server.php' );
$GLOBALS[ 'XML_RPC_defencoding' ] = 'UTF-8';

function foo($params)
{
    global $XML_RPC_erruser;
    
    $param0 = $params->getParam( 0 );
    $value0 = $param0->scalarval();
    
    $value = new XML_RPC_Value( strlen( $value ), 'int' );
    return new XML_RPC_Response( $value );
}

function bar($params)
{
    global $XML_RPC_erruser;
    
    $p1 = $params->getParam(0);
    $v1 = $p1->scalarval();
...
    
    $value = new XML_RPC_Value(
        array(
            'error' => new XML_RPC_Value( 0, 'int' ),
            'detail' => new XML_RPC_Value( 'success', 'string' )
        ), 'struct' );
    return new XML_RPC_Response( $value );
}

$server = new XML_RPC_Server( array( 'test.foo' => array( 'function' => 'foo' ),
                                     'test.bar' => array( 'function' => 'bar'  ) ) );
?>

こげなカンジで、引数の文字列長を返すfoo()と、戻り値がstructのbar()を実装。


ついで.NET側。
まずはサーバ側のサービスに対するインタフェースを定義。

public struct IHogeResult
{
    public int error;
    public string detail;
}

[XmlRpcUrl( "http://server/hoge/api/" )]
public interface IHogeService
{
    [XmlRpcMethod( "test.foo" )]  
    int Foo(string str);
    [XmlRpcMethod( "test.bar" )]
    IHogeResult Bar();
}

定義ができたら、後はこんな風にして使うだけ(・∀・)

IHogeService proxy = XmlRpcProxyGen.Create<IHogeService>();

int ret = proxy.Foo( "test" );
IHogeResult result = proxy.Bar();

仕掛けはどうなっているかというと、XML-RPCの通信機能自体はXmlRpcClientProtocolクラスにあるんですが、XmlRpcProxyGen.Create()の中ではILのEmitをして、XmlRpcClientProtocolを使うプロキシークラスをインタフェースから生成してくれているんですよね。*1
こういうのスキ〜(・∀・)♪


XML-RPCAPIを提供しているWebアプリも割とあったりするので、なにかに使ってみたいと思う今日この頃(´ー`)


ところでこのテスト用クライアントはClickOnceで作って、PHPサービスと同じApacheから配布していたんですが、人から.NET Frameworkのインストールでエラーになるよ〜と言われたり。
なにかと思って調べてみたら、Apacheのログがこんなカンジに…(゚д゚)

... "GET /.../DotNetFX35/dotNetFX35/x86/netfx35_x86.exe HTTP/1.1" 200 ...
...
... "GET /.../DotNetFX35/DotNetFX35/x64/dotnetfx35langpack_x64ja.exe HTTP/1.1" 404 ...

dotNetFX35とDotNetFX35の大文字小文字混在、っというわけで、IISに配置している分には気がつかない話ですが。
同じような罠がSilverlightのサンプルなんかにもあったりするけど、この辺、割といい加減だったり(´・ω・`)
とりあえずリンクを張ってごまかす(´・∀・`)



…とか遊んでいたら、見積もりの話を持ってこられた(´・ω・`)


ざっと見で6,000マソくらいですかネ?
っというか、その話、200万クラスのシステムがたくさんの集合体な気がしないでもなかったり。

( 200万 * 20+ ) + 800万(システム共通基盤) + 800万(PM) + その他 = 約6,000万

っていうか。
とりあえず、月曜日にちゃんと見ます(´ω`)

*1:XML-RPC.Netの中にはCompact Framework用のプロジェクトも入っているんですが、CFではEmitが使えないのでXmlRpcProxyGenは使えません(´・ω・`)