我在C#中使用库XML-RPC.NET在我的服务器上调用XML-RPC方法。当一切正常时,该方法返回一个字符串,但是当发生错误时,它返回一个XmlRpcStruct。
当我获得与我在方法签名中指定的不同的返回类型时,XML-RPC.NET引发异常:
string login(string username, string password);
异常消息:“响应包含字符串期望的结构值”
在XML-RPC.NET的文档中,它说:
“如何指定直到运行时才知道其类型的数据?
有时直到运行时才知道参数,返回值或结构成员的类型。在这种情况下,应使用System.Object数据类型。对于返回值,可以在运行时确定实际类型并进行适当处理。“
所以我将我的返回类型更改为object,现在它可以工作了。但是现在我不知道如何处理返回值。如果它是XmlRpcStruct类型我不想将它转换为我的Error类。否则我把它当作一个字符串。如何将其转换为我的Error类? XML-RPC-NET是否有转换方法或我可以调用的东西?
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;
}
有更简单的方法吗?我可以将我的方法设置为返回类型的字符串然后尝试/ catch方法调用,但后来我丢失了错误中返回的状态消息。
答案 0 :(得分: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;
}
您仍然可以通过Error类的变量访问原始的XmlRpcStruct,而不会将其丢失为try语句。可能有更好的方法来实现继承,但这是一个快速修复。