使用PHP客户端的WCF服务 - 复杂类型作为参数不起作用

时间:2009-01-28 17:17:38

标签: .net php wcf

我有三种方法的WCF服务。其中两个方法返回自定义类型(这些按预期工作),第三个方法将自定义类型作为参数并返回一个布尔值。当通过PHP soap客户端调用第三个方法时,它返回一个“未设置为对象实例的对象引用”异常。

自定义类型示例:

_ 公共类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

结束班

方式:

Public Function Add(ByVal param As MyClass)As Boolean Implements IService1.Add     '... 结束功能

PHP客户电话:

$客户端 - &gt;添加(阵列( 'PARAM'=&GT;阵列( 'PropertyA'=&gt; 1, 'PropertyB'=&gt; 2, 'PropertyC'=&gt; “2009-01-01” )));

WCF服务适用于.Net客户端,但我是PHP的新手,无法使其工作。

是否可以在PHP中创建“MyClass”实例。

任何帮助都将不胜感激。

注意:我使用的是PHP 5(适用于Windows的XAMPP 1.7.0)。

由于

马特

5 个答案:

答案 0 :(得分:3)

我不再需要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);

request是Web服务所期望的参数的名称。

如果您的自定义类型引用了其他自定义类型,则可以按如下方式设置这些属性:

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

希望有所帮助。

答案 1 :(得分:1)

我愿意打赌它是因为你使用Date类型作为你的参数之一并且它没有通过PHP正确序列化。尝试使用字符串并手动解析它。我知道,不是很安全,但你能做什么?

答案 2 :(得分:1)

我已尝试将MyClass中的所有属性类型更改为String但仍会出现相同的错误。

我还尝试使用$ myClassInstance = new $ Client-&gt; MyClass();来实例化MyClass;但是这会产生以下错误:

“类名必须是有效对象或filename.php中的字符串”

上面需要服务命名空间,例如$ myClassInstance = new $ Client-&gt; Namespace \ MyClass()?

该服务的wsdl不包含MyClass的任何描述。 MyClass类具有 DataContract() ServiceKnownType(GetType(MyClass))属性,并且属性都应用了 DataMember()属性但是仍然没有提到wsdl中的MyClass。这可能是php无法实例化的原因吗?

由于

马特

答案 3 :(得分:1)

本守则

$ myClassInstance = new $ Client-&gt; MyClass();是语法错误

但是这段代码

$ myClassInstance = new $ Client-&gt; MyClass;虽然这段代码有效

这是正确的语法 删除双括号

答案 4 :(得分:1)

wcf中的wsd与旧的Web服务相比有很大不同,它将xsd拆分为不同的文件。请仔细阅读你的wsdl,你应该可以看到这样的几行

           

这是你xsd。