C # yapı ve NuSOAP (php)

2 Cevap

Im trying to build a client in c# that talks with some remote (php)server with SOAP using the NuSOAP library. Here im using a struct/object that will containt the user info of some user:

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

Ve bu PHP Code:

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

Şimdi zaten çalışan bir oturum açma işlevi var, ve ben kullanıcı oturum açmış hakkında bilgi almak istiyorum ama nasıl yapılır bunları elde bilmiyorum. Bu Userınfo almak için kullanarak im budur:

            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 () işlevi bir hata üretir:

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

ya da ben 'yapamam ayrıştırma xml' hata gibi bir şey olsun.

The article I used for this was from: http://www.sanity-free.org/125/php_webservices_and_csharp_dotnet_soap_clients.html The difference on what they are doing and what I try to do is that I only want to get one object returned instead of multiple 'MySoapObjects'.

I hope someone is familiar with this and could help me, thanks in advance! Regards, opx

2 Cevap

Sorun getUserProfile () yöntemi Userprofile nesneleri dizisini döndürür böylece PHP sizin WSDL kurmak olduğunu gibi ilk bakışta görünüyor. Yöntemle bakarak, aslında tek bir Userprofile nesnesi döndürür ... ve C # bu nesneleri bir dizi olarak bekliyor.

Kısacası, WSDL ve kod senkronize dışında. Ben size WSDL yöntemini kayıt kodunu değiştirmek gerektiğini düşünüyorum:

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

Ayrıca böyle bir şey için web servisini çağırmak C # kodunu değiştirmek gerekir:

UserProfile user = service.getUserProfile();

Ve sonra UserProfileArray türü için tüm WSDL kayıt kurtulabilirsiniz.

Ben aynı sorunu vardı ve ben nesne WebService döndürülen olarak aynı adı taşıyan yerel bir nesne oluşturmak için çalışıyorum çünkü öyleydi.

Ne yerine yapmanız gereken, Hizmet Referans Bu süreci yönetmek ve WSDL ne okumak dayalı, benim için nesneyi tanımlamak için izin vermek oldu.

Bu nedenle, "localWS" adı verilen bir servis atıfta bulunmak sureti ile, daha sonra aşağıdaki geçerlidir:

localWS.ServReference ws = new localWS.ServReference();
localWS.ServReference.MyObject obj = localWS.ServReference.MyObject();
obj = localWS.ServReference.CallMethodHere();