我有this question的后续问题。
我正在编写一个动态调用其他Web服务的Web服务,使用找到的here WSProxy类。
使用WSProxy返回具有动态类型的对象,具体取决于调用的Web服务方法。例如,如果我正在调用返回...的方法
<StateCodes>
<StateCode>
<Code>AL</Code>
<Name>Alabama</Name>
</StateCode>
<!-- and so on -->
</StateCodes>
然后该对象的类型为 StateCodes [] 。
如果我正在调用一个返回...的方法
<GetVehicleMakes>
<VehicleMakes>
<Vehicle_Make_Code>00</Vehicle_Make_Code>
<Vehicle_Make_Description>Ford</Vehicle_Make_Description>
</VehicleMakes>
<VehicleMakes>
<Vehicle_Make_Code>01</Vehicle_Make_Code>
<Vehicle_Make_Description>Toyota</Vehicle_Make_Description>
</VehicleMakes>
<!-- and so on -->
</GetVehicleMakes>
然后该对象的类型为 GetVehicleMakes [] 。
我无法预先声明类类型,因为返回对象的类类型由调用的Web服务方法确定,并且Web服务方法是在运行时确定的。我正在测试的本地服务上有许多具有不同返回类型的方法。 我不会在运行时之前知道返回对象的类型,因为可以调用来自任何Web服务的任何方法。
当我尝试将对象直接返回时,就像这样:
[WebMethod]
public object RunService(string webServiceAsmxUrl, string serviceName, string methodName, string jsonArgs)
{
WSDLRuntime.WsProxy wsp = new WSDLRuntime.WsProxy();
// Convert JSON to C# object.
JavaScriptSerializer jser = new JavaScriptSerializer();
var dict = jser.Deserialize<Dictionary<string,object>>(jsonArgs);
object result = wsp.CallWebService(webServiceAsmxUrl, serviceName, methodName, dict);
// This line produces the error.
return result;
}
我可以在返回结果行插入断点,然后浏览我的结果对象。例如,当我调用StateCodes方法时,结果变量是StateCodes []数组。
但是,一旦返回结果运行,XML解析器就不会拥有它。
System.InvalidOperationException: The type StateCodes[] may not be used in this context.
我已经搜索了答案,我看到了“反射”和“序列化”这样的术语,但我对C#很新,不知道这些是我想要的还是它们的工作方式。 我正在使用C#3.5。
答案 0 :(得分:3)
看起来您需要返回从服务调用返回的xml。您无法直接返回对象,因为顶级服务(具有返回类型的对象的服务)不会在运行时生成;它是在消耗wsdl时定义的。
长话短说,您应该将顶级WebMethod的返回类型更改为字符串并手动序列化result
以执行您想要的操作。然后,客户端(可能知道他们希望通过webServiceAsmxUrl
,serviceName
和methodName
从他们请求的服务中获取的内容)可以自行反序列化结果。