我的 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 客户端使其工作。到目前为止,我们在创建将作为对象传递但仍包含内部真实值(字符串/布尔值/PickList)的东西时遇到了麻烦。
请注意: WCF 服务正在生产中,不能更改它。我正在寻找 PHP 客户端的解决方案。
以下是他的不同尝试:
1)首先尝试 - 简单的字符串作为值:
<?php
$da = new DynamicAttributeInfo();
$da->DynamicAttributeType = 'String';
$da->Name = 'lv_eutmsource';
$da->Value = 'test';
?>
异常:[InnerException] => stdClass Object ([HelpLink] => [InnerException] => [Message] => 来自命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX 的结束元素'Value' .XXXService.Common.Entities' 预期。找到文本“测试”。第 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 Object ( [HelpLink] => [InnerException] => stdClass Object ( [HelpLink] => [InnerException] => [Message] => 来自命名空间'http://的结束元素'Value' schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities' 预期。从命名空间''中找到元素'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] => stdClass Object ( [HelpLink] => [InnerException] => stdClass Object ( [HelpLink] => [InnerException] => [Message] => 来自命名空间'http://的结束元素'Value' schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities 预期。从命名空间“”中找到元素“文本”。
<?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 Object ( [HelpLink] => [InnerException] => stdClass Object ( [HelpLink] => [InnerException] => [Message] => 来自命名空间'http://的结束元素'Value' schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities 预期。从命名空间“”中找到元素“值”。