Как вернуть динамически типизированный объект в мой веб-сервис на C #? - PullRequest
0 голосов
/ 12 ноября 2010

У меня есть дополнительный вопрос к этому вопросу .

Я пишу веб-сервис, который динамически вызывает другие веб-сервисы, используя найденный класс WSProxy здесь .

Использование WSProxy возвращает объект с динамическим типом, в зависимости от вызываемого метода веб-службы. Например, если я вызываю метод, который возвращает ...

<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 [] .

Я не могу объявить тип класса заранее, потому что тип класса возвращаемого объекта определяется вызываемым методом веб-службы, а метод веб-службы определяется во время выполнения. В локальной службе, с которой я тестирую, есть десятки методов с разными типами возврата. Я не узнаю тип возвращаемого объекта до выполнения, потому что любой метод из любого веб-сервиса может быть вызван.

Когда я пытаюсь вернуть объект прямо вверх, вот так:

[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;

}

Я могу вставить точку останова в строку return result и просмотреть мой result object. Например, когда я вызываю метод StateCodes, результирующей переменной является массив StateCodes [].

Однако после запуска возвращаемого результата синтаксический анализатор XML не будет иметь его.

System.InvalidOperationException: The type StateCodes[] may not be used in this context.

Я искал ответы, и я вижу такие термины, как «отражение» и «сериализация», но я очень плохо знаком с C # и не знаю, хочу ли я это или как они работают. Я использую C # 3.5.

1 Ответ

3 голосов
/ 15 ноября 2010

Похоже, вам нужно вернуть XML, который возвращается из вызова службы. Вы не можете вернуть объект напрямую, потому что служба верхнего уровня (та, которая имеет возвращаемый тип объекта) не генерируется во время выполнения; это определено, когда его wsdl потребляется.

Короче говоря, вы должны изменить тип возвращаемого значения вашего веб-метода верхнего уровня на string и сериализовать result вручную, чтобы делать то, что вы хотите. Затем клиент (который предположительно знает, что он ожидает получить от службы, которую он запрашивает через webServiceAsmxUrl, serviceName и methodName), может самостоятельно десериализовать результат.

...