2009-01-28 6 views
2

J'ai un service WCF avec trois méthodes. Deux des méthodes retournent des types personnalisés (ceux-ci fonctionnent comme prévu), et la troisième méthode prend un type personnalisé en tant que paramètre et renvoie un booléen. Lors de l'appel de la troisième méthode via un client de savon PHP, elle renvoie une exception "Référence de l'objet non définie sur une instance d'un objet".Service WCF avec client PHP - type complexe en tant que paramètre ne fonctionnant pas

Exemple Personnalisé:

_ Classe publique MyClass

Private _propertyA As Double 
<DataMember()> _ 
Public Property PropertyA() As Double 
    Get 
     Return _propertyA 
    End Get 
    Set(ByVal value As Double) 
     _propertyA = value 
    End Set 
End Property 

Private _propertyB As Double 
<DataMember()> _ 
Public Property PropertyB() As Double 
    Get 
     Return _propertyB 
    End Get 
    Set(ByVal value As Double) 
     _propertyB = value 
    End Set 
End Property 

Private _propertyC As Date 
<DataMember()> _ 
Public Property PropertyC() As Date 
    Get 
     Return _propertyC 
    End Get 
    Set(ByVal value As Date) 
     _propertyC = value 
    End Set 
End Property 

End Class

Méthode:

Fonction publique Ajouter (ByVal param MyClass) Comme Boolean Implements IService1.Add '... End Function

PHP appel client:

$ client-> Ajouter (array (' param '=> array ( 'PropertyA'=> 1, 'PropertyB'= > 2, 'PropertyC' => "2009-01-01" )));

Le service WCF fonctionne correctement avec un client .Net, mais je ne connais pas PHP et je ne peux pas le faire fonctionner.

Est-il possible de créer une instance de 'MyClass' en PHP.

Toute aide serait appréciée.

Note: J'utilise PHP 5 (XAMPP 1.7.0 pour Windows).

Merci

Matt

+0

aviez-vous essayé $ myClassInstance = new $ Client-> MyClass(); –

+0

Matt - avez-vous déjà trouvé une solution à ce problème? J'ai un problème similaire avec un PHP qui ne peut pas passer une instance de classe dans un service web. –

+0

@Steve: Voir ma réponse ci-dessous. –

Répondre

2

Je n'ai plus la configuration XAMPP afin de tester, mais voici quelques exemples de code:

PHP:

$wsdl = "https://....../ServiceName.svc?wsdl"; 
$endpoint = "https://...../ServiceName.svc/endpointName"; 
$client = new SoapClient($wsdl, array('location'=>$endpoint)); 

$container = new stdClass(); 

$container->request->PropertyA = 'Test 1'; 
$container->request->PropertyB = 'Test 2'; 
$container->request->PropertyC = '05/10/2010'; 

$response = $client->ServiceMethodA($container); 

demande est le nom du paramètre attendu par le service Web.

Si vous avez un type personnalisé avec des références à d'autres types personnalisés que vous pouvez définir les propriétés comme suit:

$container->request->OtherCustomType->Property1 = 'Test'; 

espoir qui aide.

1

Je serais prêt à parier que c'est parce que vous utilisez un type de date comme l'un de vos paramètres et il ne sérialisation correctement par PHP. Essayez d'utiliser une chaîne et de l'analyser manuellement. Je sais, pas très sûr de type, mais que pouvez-vous faire?

1

J'ai essayé de changer tous les types de propriété dans MyClass en chaîne mais toujours obtenir la même erreur.

J'ai également essayé d'instancier MyClass en utilisant $ myClassInstance = new $ Client-> MyClass(); mais cela génère l'erreur suivante:

« Nom de la classe doit être un objet valide ou une chaîne dans filename.php »

est l'espace de noms de service requis ci-dessus par exemple $ myClassInstance = new $ Client-> Namespace \ MyClass()?

Le fichier wsdl du service ne contient aucune description de MyClass. La classe MyClass a DataContract() et ServiceKnownType (GetType (MyClass)) attribut et les propriétés ont tous le DataMember() attribut appliqué mais toujours aucune mention de MyClass dans le fichier WSDL. Serait-ce la raison pour laquelle php ne peut pas l'instancier?

Merci

Matt

1

Ce code

$ myClassInstance = new $ client-> MyClass(); est une erreur de syntaxe

mais ce code

$ myClassInstance = new $ client-> MyClass; alors que ce code fonctionne

c'est la syntaxe correcte supprimer la double parenthèse

1

Le wsdl dans WCF est un énorme différent comparer à l'ancien service Web, il divisé xsd dans des fichiers différents. S'il vous plaît lire attentivement vous wsdl, vous devriez être en mesure de voir plusieurs lignes comme celui-ci

ici est que vous xsd.

Questions connexes