Вызов XML-RPC .NET с ассоциативным массивом

Я пытаюсь выполнить некоторые действия на удаленном сервере, используя библиотеку XML-RPC .NET и C#. У меня нет опыта использования этого протокола, но большинство примеров кажутся довольно простыми. Но сервер, с которым я пытаюсь связаться, похоже, анализирует команды немного иначе, чем большинство примеров, которые я видел.

Все вызовы выполняются с использованием функции 'perform_actions', и она ожидает список действий вместе с ней в качестве параметра. К счастью, есть довольно приличная документация с некоторыми примерами кода, но эти примеры сделаны на Ruby/Perl, с которыми у меня нет опыта. Я пытался перевести их на С#, и я считаю, что нахожусь на правильном пути, но постоянно получаю ошибку"Server returned a fault exception: [400] Invalid request: expected list of actions."

Мой текущий код

    [XmlRpcUrl("https://DOMAIN/admin/rpc")]
    public interface iFace : IXmlRpcProxy
    {
        [XmlRpcMethod("perform_actions")]
        XmlRpcStruct[] perform_actions(XmlRpcStruct struc);
    }


    public void GetData()
    {
        XmlRpcStruct actions = new XmlRpcStruct();
        actions.Add("name", "registrations.accounts.list");

        iFace proxy = XmlRpcProxyGen.Create<iFace>();
        proxy.Credentials = new NetworkCredential("USERNAME", "PASSWORD");

        XmlRpcStruct[] response = proxy.perform_actions(actions);
    }

И вот пример Ruby из документации API, который я пытался воспроизвести, который является функциональным

require 'xmlrpc/client'

url = 'https://user:[email protected]/admin/rpc'
c = XMLRPC::Client.new_from_uri(url)

# Call the action to list the access groups.
ags = c.call('perform_actions', [{
    'name' => 'network.accessgroups.list',
    'args' => {}
}])

Похоже, что сервер действительно не распознает XmlRpcStruct, который я отправляю, поскольку ошибка, похоже, жалуется на то, что не получен список действий. (Я получаю ту же ошибку, если не отправляю параметр). Однако, если я изменю XmlRpcStruct на обычный массив строк, он будет жаловаться на ожидание структуры, поэтому данные не будут полностью игнорироваться.

Кто-нибудь может помочь мне в правильном направлении с моей проблемой или кто-нибудь знает, почему возвращается эта ошибка?


person Stella    schedule 16.03.2015    source источник


Ответы (1)


Наконец-то удалось разобраться в моей дилемме. Кажется, мне пришлось передать массив XmlRpcStruct, а не просто единственное число XmlRpcStruct, следующее решило мою проблему:

        XmlRpcStruct[] actions = new XmlRpcStruct[1];
        XmlRpcStruct action = new XmlRpcStruct();
        action.Add("name", "registrations.accounts.list");
        actions[0] = action;

Я только что передал actions в качестве параметра функции perform_actions.

person Stella    schedule 16.03.2015