2

サーバーで 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 を実行できますが、エラーで返されたステータス メッセージが失われます。

4

1 に答える 1

0

Error クラスが XmlRpcStruct 変数を保持しているとしたら、次のようになります。

public class Error
{
    public string status;
    public XmlRpcStruct xmlstr;
}

次に、XmlRpcStruct を Error オブジェクトの変数に割り当てることができます。

object ret = proxy.login("admin", "1234");
Type t = ret.GetType();

if (t == typeof(XmlRpcStruct))
{
    Error err = new Error();
    err.xmlstr = (XmlRpcStruct)ret;
}
else
{
    string result = (string)ret;
}

また、try ステートメントで失われることなく、Error クラスの変数を介して元の XmlRpcStruct に引き続きアクセスできます。継承でこれを達成するためのより良い方法があるかもしれませんが、これは簡単な修正です。

于 2012-09-27T20:29:46.617 に答える