0

我的 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 预期。从命名空间“”中找到元素“值”。

4

1 回答 1

0

所以我的客户毕竟能够让它工作。就是这样:

而不是像我通常所做的那样明确地为该字段分配值:

$DynamicAttributeInfo->Value = $text;

我必须手动创建一个 SOAP 变量,明确定义它的类型和命名空间:

$DynamicAttributeInfo->Value = new SoapVar($text,XSD_STRING,'string','http://www.w3.org/2001/XMLSchema');

这样它就按预期通过了。

于 2013-01-10T08:20:55.110 回答