我的WCF服务可以接受通过传递包装在Object和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] =&gt; stdClass对象 ( [HelpLink] =&gt; [InnerException] =&gt; [留言] =&gt;命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'的结束元素'Value'。找到文本'测试'。第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] =&gt; stdClass对象 ( [HelpLink] =&gt; [InnerException] =&gt; stdClass对象 ( [HelpLink] =&gt; [InnerException] =&gt; [留言] =&gt;命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'的结束元素'Value'。从命名空间''找到元素'String'。
<?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] =&gt; stdClass对象 ( [HelpLink] =&gt; [InnerException] =&gt; stdClass对象 ( [HelpLink] =&gt; [InnerException] =&gt; [留言] =&gt;命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'的结束元素'Value'。从命名空间''找到元素'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] =&gt; stdClass对象 ( [HelpLink] =&gt; [InnerException] =&gt; stdClass对象 ( [HelpLink] =&gt; [InnerException] =&gt; [留言] =&gt;命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'的结束元素'Value'。从命名空间''找到元素'Value'。
答案 0 :(得分:0)
所以我的客户终于可以让它工作了。方法如下:
不像我通常那样明确地为字段赋值:
$DynamicAttributeInfo->Value = $text;
我不得不手动创建一个SOAP变量,明确定义它的类型和命名空间:
$DynamicAttributeInfo->Value = new SoapVar($text,XSD_STRING,'string','http://www.w3.org/2001/XMLSchema');
这样它按预期传递。