PHP istemcisi ile WCF servisi - parametre çalışmıyor gibi karmaşık tip

5 Cevap ûnet

Ben üç yöntem ile bir WCF hizmeti var. Yöntemlerden ikisi özel türleri (beklendiği gibi bu iş) dönmek ve üçüncü yöntem bir parametre olarak özel bir tür alır ve bir boolean döndürür. Bir PHP sabun istemci üzerinden üçüncü yöntemi çağrılırken istisnasız bir 'bir nesne örneğine ayarlanmadı nesne başvurusu' döndürür.

Example Custom Type:

_ Public Class 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

Method:

Public Function Add(ByVal param As MyClass) As Boolean Implements IService1.Add ' ... End Function

PHP client call:

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

WCF hizmeti. Net müşteri ile çalışıyor ama PHP için yeni kulüpler ve bu işe alınamıyor.

PHP içinde 'Sınıfım' bir örneğini oluşturmak mümkündür.

Herhangi bir yardım mutluluk duyacağız.

Not: I (Windows için XAMPP 1.7.0) PHP 5 kullanıyorum.

Teşekkürler

Mat

5 Cevap

Ben artık test etmek için XAMPP kurulum var ama burada bazı örnek kod:

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

isteği web servisi tarafından beklenen parametrenin adıdır.

Eğer diğer özel türlerine referansları ile özel bir tip varsa aşağıdaki gibi bu özellikleri ayarlayabilirsiniz:

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

Umut olur.

Eğer parametrelerden biri olarak tarihi türünü kullanarak konum ve PHP ile düzgün serializing değil çünkü ben bu kadar bahis istekli olurdu. Bir dize kullanarak ve elle ayrıştırma deneyin. Ben çok türü güvenli değil biliyorum, ama ne yapabilirim?

Ben String Sınıfım tüm Gayrimenkul türleri değiştirmeyi denedim ama yine aynı hatayı alıyorum var.

Ben de $ myClassInstance = new $ Client-> Sınıfım () kullanarak Sınıfım örneğini çalıştı; ancak bu aşağıdaki hata üretir:

"Sınıf adı filename.php geçerli bir nesne veya bir dize olmalı"

Hizmet ad, mesela yukarıda gerekli $ MyClassInstance = new $ Client-> Ad \ Sınıfım (?)

Hizmeti için WSDL MyClass herhangi bir tarif içermez. Class Sınıfım DataContract() vardır ve ServiceKnownType(GetType(MyClass)) nitelik ve özellikleri tüm DataMember() nitelik wsdl hala Sınıfım hiçbir söz uygulanan ancak var. Bu php başlatamazsınız nedeni olabilir?

Teşekkürler

Mat

Bu Kodu

$ MyClassInstance = new $ Client-> Sınıfım (); bir sözdizimi hatası olduğunu

ancak bu kod

$ MyClassInstance = new $ Client-> Sınıfım; Bu kod çalışır iken

this is the correct syntax remove the double parenthesis

WCF Wsdl olan büyük bir eski web hizmetine karşılaştırmak farklı, bu farklı dosyalara Xsd ayrıldı. Dikkatli sizin Wsdl okuyunuz, böyle birkaç satır görmek gerekir

burada size xsd olduğunu.