サーバーで XML-RPC メソッドを呼び出すために、C# でライブラリ XML-RPC.NET を使用しています。このメソッドは、すべてが正常な場合は文字列を返しますが、エラーが発生した場合は XmlRpcStruct を返します。
メソッド シグネチャで指定したものとは異なる戻り値の型を取得すると、XML-RPC.NET が例外をスローしました。
string login(string username, string password);
例外メッセージ: 「応答には、文字列が期待される場所に構造体の値が含まれています」
XML-RPC.NET のドキュメントには、次のように書かれています。
「実行時まで型がわからないデータを指定するにはどうすればよいですか?
パラメーター、戻り値、または構造体メンバーの型は、実行時までわからない場合があります。このシナリオでは、System.Object データ型を使用する必要があります。戻り値の場合、実際の型は実行時に決定され、適切に処理されます。」
そのため、戻り値の型をオブジェクトに変更したところ、機能するようになりました。ただし、戻り値の処理方法がわかりません。タイプが XmlRpcStruct の場合、エラー クラスに変換したくありません。それ以外の場合は、文字列として扱います。それを Error クラスに変換するにはどうすればよいですか? XML-RPC-NET には convert メソッドまたは呼び出すことができるメソッドがありますか?
public interface Proxy : IXmlRpcProxy
{
[XmlRpcMethod("login")]
object login(string username, string password);
}
// When the login method fails I get an XmlRpcStruct that has a
// key "status" with a string value. I'd like to cast the returned
// XmlRpcStruct to my Error class. How?
public class Error : XmlRpcStruct
{
public string status;
}
そして、メソッドを呼び出すと:
object ret = proxy.login("admin", "1234");
Type t = ret.GetType();
if (t == typeof(XmlRpcStruct))
{
// This will set err to null even though ret is not null
// How do I convert it?
Error err = ret as Error;
}
else
{
string result = (string)ret;
}
これを行う簡単な方法はありますか?メソッドを文字列の戻り値の型に設定してから、メソッド呼び出しの周りで try/catch を実行できますが、エラーで返されたステータス メッセージが失われます。