C # struct и NuSOAP (php) - PullRequest
       19

C # struct и NuSOAP (php)

1 голос
/ 16 июля 2009

Я пытаюсь создать клиент на c #, который общается с каким-нибудь удаленным (php) сервером с помощью SOAP с использованием библиотеки NuSOAP. Здесь я использую структуру / объект, который будет содержать информацию о пользователе какого-то пользователя:

public struct UserProfile {
            public string username;
            public string password;
            public string email;
            public string site;
            public string signature;
            public int age;
            public int points;

А это код PHP:

server->wsdl->addComplexType(
                'UserProfile',
                'complexType',
                'struct',
                'all',
                '',
                array(
                    'username' => array('name' => 'username', 'type' => 'xsd:string'),
                    'password' => array('name' => 'password', 'type' => 'xsd:string'),
                    'email' => array('name' => 'email', 'type' => 'xsd:string'),
                    'site' => array('name' => 'site', 'type' => 'xsd:string'),
                    'signature' => array('name' => 'signature', 'type' => 'xsd:string'),
                    'age' => array('name' => 'age', 'type' => 'xsd:int'),
                    'points' => array('name' => 'username', 'type' => 'xsd:int'),
                )
);

$server->wsdl->addComplexType(
                'UserProfileArray',
                'complexType',
                'array',
                '',
                'SOAP-ENC:Array',
                array(),
                array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:UserProfile[]')),
                'tns:UserProfile'
);

$server->register("getUserProfile",
    array(),
    array('return' => 'tns:UserProfileArray'),
    $namespace,
    false,
    'rpc',
    false,
    'Get the user profile object'
);

function getUserProfile(){
    $profile['username'] = "user";
    $profile['password'] = "pass";
    $profile['email'] = "usern@ame";
    $profile['site'] = "u.com";
    $profile['signature'] = "usucsdckme";
    $profile['age'] = 111;
    $profile['points'] = time() / 2444;

    return $profile;
}

Теперь у меня уже есть работающая функция входа в систему, и я хочу получить информацию о зарегистрированном пользователе, но я не знаю, как их получить. Это то, что я использую, чтобы получить userinfo:

            string user = txtUser.Text;
            string pass = txtPass.Text;
            SimpleService.SimpleService service = new SimpleService.SimpleService();
            if(service.login(user, pass)){
                 //logged in

            }

            SoapApp.SimpleService.UserProfile[] user = service.getUserProfile(); // THIS LINE GIVES ME AN EXCEPTION

            MessageBox.Show(user[0].username + "--" + user[0].points);

Функция getUserProfile () выдает ошибку:

System.Web.Services.Protocols.SoapException was unhandled
  Message="unable to serialize result"
  Source="System.Web.Services"

или я получаю что-то вроде ошибки 'cant parse xml'.

Статья, которую я использовал для этого, была от: http://www.sanity -free.org / 125 / php_webservices_and_csharp_dotnet_soap_clients.html Разница в том, что они делают, и в том, что я пытаюсь сделать, заключается в том, что я хочу получить только один возвращенный объект вместо нескольких «MySoapObjects».

Я надеюсь, что кто-то знаком с этим и может мне помочь, заранее спасибо! С Уважением, Opx

Ответы [ 2 ]

0 голосов
/ 11 января 2010

У меня была такая же проблема, и это потому, что я пытался создать объект локально с тем же именем, что и объект, возвращаемый из WebService.

Вместо этого мне нужно было разрешить Service Reference управлять этим процессом и определить для меня объект на основе того, что он прочитал из WSDL.

Итак, со ссылкой на службу, называемой localWS, применяется следующее:

localWS.ServReference ws = new localWS.ServReference();
localWS.ServReference.MyObject obj = localWS.ServReference.MyObject();
obj = localWS.ServReference.CallMethodHere();
0 голосов
/ 16 июля 2009

На первый взгляд кажется, что проблема в том, что вы настроили свой WSDL в PHP, чтобы ваш метод getUserProfile () возвращал массив объектов UserProfile. Посмотрев на метод, он фактически возвращает только один объект UserProfile ... и C # ожидает, что он будет массивом объектов.

Короче говоря, ваш WSDL и код не синхронизированы. Я думаю, что вам нужно изменить код, где вы регистрируете метод с WSDL:

$server->register("getUserProfile",
    array(),
    array('return' => 'tns:UserProfile'),
    $namespace,
    false,
    'rpc',
    false,
    'Get the user profile object'
);

Вам также придется изменить код C #, вызывающий веб-сервис, на что-то вроде этого:

UserProfile user = service.getUserProfile();

И тогда вы можете избавиться от всей регистрации WSDL для типа UserProfileArray.

...