如何在C#Web服务中返回动态类型的对象?

时间:2010-11-12 20:36:56

标签: c# xml web-services types

我有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。

1 个答案:

答案 0 :(得分:3)

看起来您需要返回从服务调用返回的xml。您无法直接返回对象,因为顶级服务(具有返回类型的对象的服务)不会在运行时生成;它是在消耗wsdl时定义的。

长话短说,您应该将顶级WebMethod的返回类型更改为字符串并手动序列化result以执行您想要的操作。然后,客户端(可能知道他们希望通过webServiceAsmxUrlserviceNamemethodName从他们请求的服务中获取的内容)可以自行反序列化结果。