Служба WCF с клиентом PHP - сложный тип в качестве параметра не работает - PullRequest
3 голосов
/ 28 января 2009

У меня есть служба WCF с тремя методами. Два метода возвращают пользовательские типы (они работают как положено), а третий метод принимает пользовательский тип в качестве параметра и возвращает логическое значение. При вызове третьего метода через мыльный клиент PHP он возвращает исключение «Ссылка на объект не установлена ​​на экземпляр объекта».

Пример Пользовательский Тип:

_ Публичный класс 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

Конечный класс

Метод:

Открытая функция Add (ByVal param As MyClass), поскольку Boolean реализует IService1.Add '... Конечная функция

вызов клиента PHP:

$ client-> Добавить (массив ( 'пары' => массив ( 'PropertyA' => 1, 'PropertyB' => 2, 'PropertyC' => "2009-01-01" )));

Служба WCF отлично работает с клиентом .Net, но я новичок в PHP и не могу заставить его работать.

Можно ли создать экземпляр MyClass в PHP.

Буду признателен за любую помощь.

Примечание. Я использую PHP 5 (XAMPP 1.7.0 для Windows).

Спасибо

Мэтт

Ответы [ 5 ]

3 голосов
/ 05 октября 2010

У меня больше нет настройки XAMPP для тестирования, но вот пример кода:

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

запрос - это имя параметра, ожидаемого веб-службой.

Если у вас есть пользовательский тип со ссылками на другие пользовательские типы, вы можете установить эти свойства следующим образом:

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

Надеюсь, это поможет.

1 голос
/ 03 мая 2010

wsdl в wcf сильно отличается от старого веб-сервиса, он разделяет xsd на разные файлы. Пожалуйста, внимательно прочитайте ваш wsdl, вы должны увидеть несколько строк, подобных этой

вот ты xsd.

1 голос
/ 29 января 2009

Я попытался изменить все типы свойств в MyClass на String, но все равно получаю ту же ошибку.

Я также пытался создать экземпляр MyClass с помощью $ myClassInstance = new $ Client-> MyClass (); но это приводит к следующей ошибке:

«Имя класса должно быть допустимым объектом или строкой в ​​filename.php»

Требуется ли пространство имен службы выше, например, $ myClassInstance = new $ Client-> Namespace \ MyClass ()?

wsdl для службы не содержит описания MyClass. Класс MyClass имеет атрибут DataContract () и ServiceKnownType (GetType (MyClass)) , а все свойства имеют атрибут DataMember () , но все еще не упоминаются MyClass в WSDL. Может ли это быть причиной того, что php не может создать его экземпляр?

Спасибо

Мэтт

1 голос
/ 14 апреля 2010

Этот код

$ myClassInstance = new $ Client-> MyClass (); такое синтаксическая ошибка

но этот код

$ myClassInstance = новый $ Client-> MyClass; пока этот код работает

это правильный синтаксис убрать двойные скобки

1 голос
/ 28 января 2009

Я бы поспорил, потому что вы используете тип Date в качестве одного из ваших параметров, и он не сериализуется должным образом через PHP. Попробуйте использовать строку и разобрать ее вручную. Я знаю, не очень безопасный тип, но что вы можете сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...