我的WCF服务可以接受一个动态更新字段的请求,通过传递一个对象包装的值和一个DynamicAttributeType枚举来指定类型,如下所示:
[DataContract]
[KnownType(typeof(string))]
[KnownType(typeof(bool))]
[KnownType(typeof(PickListInfo))]
public class DynamicAttributeInfo
{
[DataMember]
public string Name { get; set; }
[DataMember]
public object Value { get; set; }
[DataMember]
public DynamicAttributeType DynamicAttributeType { get; set; }
}
这对于。net客户端工作得很好。我试图帮助一个PHP客户端使其工作。到目前为止,我们在创建一个将作为Object传递但仍然包含真值(string/bool/PickList)的东西时遇到了麻烦。
请注意: WCF服务在生产中,不能更改它。我正在寻找一个解决方案的PHP客户端。
以下是他不同的尝试:
1)第一次尝试-简单字符串作为值:
<?php
$da = new DynamicAttributeInfo();
$da->DynamicAttributeType = 'String';
$da->Name = 'lv_eutmsource';
$da->Value = 'test';
?>
例外:[InnerException] => stdClass对象([HelpLink] =>[InnerException] =>[消息]=>结束元素'值'从命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'期望。找到文本"test"。第2行,位置725.
2)第二次(半成功):一个空类的新对象
<?php
class testText() {
}
$da = new DynamicAttributeInfo();
$da->DynamicAttributeType = 'String';
$da->Name = 'lv_eutmsource';
$da->Value = new testText();
?>
这次没有WCF异常,但是实际上没有传递任何值,我的代码以"Object.ToString"结束。
3)其他尝试:非空类-他试图添加不同名称的字段-没有效果。
<?php
class Value() {
public $String;
}
$text = new Value();
$text->String = 'test text';
$da = new DynamicAttributeInfo();
$da->DynamicAttributeType = 'String';
$da->Name = 'lv_eutmsource';
$da->Value = $text;
?>
例外:[InnerException] => stdClass对象([HelpLink] =>[InnerException] => stdClass对象([HelpLink] =>[InnerException] =>[消息]=>结束元素'值'从命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'期望。
<?php
class textText() {
public $text;
}
$text = new testText();
$text->text = 'test text';
$da = new DynamicAttributeInfo();
$da->DynamicAttributeType = 'String';
$da->Name = 'lv_eutmsource';
$da->Value = $text;
?>
例外:[InnerException] => stdClass对象([HelpLink] =>[InnerException] => stdClass对象([HelpLink] =>[InnerException] =>[消息]=>结束元素'值'从命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'期望。从命名空间" .
找到元素" text "<?php
class Value() {
public $Value;
}
$text = new Value();
$text->Value = 'test text';
$da = new DynamicAttributeInfo();
$da->DynamicAttributeType = 'String';
$da->Name = 'lv_eutmsource';
$da->Value = $text;
?>
例外:[InnerException] => stdClass对象([HelpLink] =>[InnerException] => stdClass对象([HelpLink] =>[InnerException] =>[消息]=>结束元素'值'从命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'期望。从命名空间"找到元素" Value "。
所以我的客户毕竟能够使它工作。方法如下:
而不是像我通常做的那样直接给字段赋值:
$DynamicAttributeInfo->Value = $text;
我必须手动创建一个SOAP变量,显式地定义它的类型和名称空间:
$DynamicAttributeInfo->Value = new SoapVar($text,XSD_STRING,'string','http://www.w3.org/2001/XMLSchema');