У меня есть дополнительный вопрос к этому вопросу .
Я пишу веб-сервис, который динамически вызывает другие веб-сервисы, используя найденный класс 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.