我有一组Web服务方法返回一个包含以下属性的ActionResult类:
object returnValue
bool success
string message
returnValue用于保存不同类型的返回值,具体取决于所使用的Web方法。
我在客户端遇到的问题是,如果一个web方法在returnValue中返回一个内部类,我无法转换它,因为客户端无法识别该类型。
我可以让fejk方法能够公开我需要的类“问题”。
例如:
Issue ExposeIssueType()
{
return null;
}
但是,还有其他办法吗?
答案 0 :(得分:1)
在等待你的评论回答时,我会告诉你这是一个非常糟糕的网络服务设计。每个Web服务操作都应返回它要返回的数据。创建一个可以保存所有可能返回值的类是没有意义的。
此外,您不应使用字符串消息从Web服务返回错误。 SOAP协议具有用于此目的的“SOAP Fault”机制。
由于您正在使用WCF,因此您完全支持SOAP Faults。例如:
在服务合同中:
[FaultContract(typeof(GeneralFault))]
[OperationContract]
int Divide(int a, int b);
在服务中:
public int Divide(int a, int b)
{
if (b == 0)
{
throw new FaultException<GeneralFault>(
new GeneralFault {Message = "Attempt to divide by zero"});
}
return a / b; // Note - operation can focus on its job
}
故障中返回的数据的数据合同:
[DataContract]
public class GeneralFault
{
[DataMember]
public string Message {get;set;}
}
答案 1 :(得分:0)
在共享DLL中创建您的类型(将其标记为Serializable),引用线的两侧。
答案 2 :(得分:0)
拥有object
值对于网络服务来说绝不是一个好主意;当你只有xml(或类似的)时,它怎么能有机会?
您可能尝试使用多个子类进行一些偷偷摸摸的技巧;但不确定这是不是一个好主意。
答案 3 :(得分:0)
您不能在web方法签名中使用对象,因为它不像您想象的那样只是序列化。你可以做的是使用泛型类型:
public class ActionResult<T>
{
public T returnValue
public bool success
public string message
}
然后您的网络方法应该返回ActionResult<Issue>
要解决注释的问题和(不合理!) - 1,运行并调用。
[WebMethod]
public object example()
{
return new foo
{
bar = "bar",
baz = "baz"
};
}
public class foo
{
public string bar { get; set; }
public string baz { get; set; }
}
结果:
System.InvalidOperationException: 生成XML时出错 文献。 ---&GT; System.InvalidOperationException:The 类型Test + foo不是预期的。使用 XmlInclude或SoapInclude 用于指定类型的属性 不知道静态。
换句话说,你必须指定所有可以返回的非基本类型 - 这几乎与你想要实现的内容相悖。
我已经改变了关于可串行化的原始断言。