【发布时间】:2012-12-20 06:36:01
【问题描述】:
我的 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] => 标准类对象 ( [帮助链接] => [内部异常] => [消息] => 预期来自命名空间“http://schemas.datacontract.org/2004/07/XXX.XXX.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] => 标准类对象 ( [帮助链接] => [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] => 标准类对象 ( [帮助链接] => [InnerException] => 标准类对象 ( [帮助链接] => [内部异常] => [消息] => 预期来自命名空间“http://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] => 标准类对象 ( [帮助链接] => [InnerException] => 标准类对象 ( [帮助链接] => [内部异常] => [消息] => 预期来自命名空间“http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities”的结束元素“值”。从命名空间“”中找到元素“值”。
【问题讨论】:
-
您显然已经连接到 WCF 服务,但您应该添加实际序列化对象的方式。另外,您是否分析了序列化输出并将其与 Microsoft 的规范进行了比较?
标签: php wcf object serialization