我有三种方法的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)。
由于
马特
答案 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。