0

私の 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] => [Message] => 名前空間 'http://schemas.datacontract.org/2004/07/XXX.XXX からの要素 'Value' の終了.XXXService.Common.Entities' が必要です。テキスト 'test' が見つかりました。2 行目、位置 725。

2) 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] => [Message] => 名前空間 'http:// 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 オブジェクト ( [HelpLink] => [InnerException] => stdClass オブジェクト ( [HelpLink] => [InnerException] => [Message] => 名前空間 '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] => [Message] => 名前空間 'http:// schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities' が必要です。名前空間 '' から要素 'Value' が見つかりました。

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 に答える