C # yanlış SOAP dizi türü ayrıştırma

2 Cevap

Ben bir karmaşık türü bir dizi döndüren bir SOAP hizmeti var. PHP NuSOAP in tanımı aşağıdaki gibidir:

// The type itself
$server->wsdl->addComplexType(
    "Clip",
    "complexType",
    "struct",
    "all",
    "",
    array(
      "Id" => array(
        "name" => "id",
        "type" => "xsd:int"
      )
      // ---snip---
    )
  );

// The type of the array
$server->wsdl->addComplexType(
    "ClipList",
    "complexType",
    "array",
    "sequence",
    "",
    array(
      "clip" => array(
        "name"      => "clip",
        "type"      => "tns:Clip",
        "minOccurs" => "0",
        "maxOccurs" => "unbounded"
      )
    ),
    array(),
    "tns:Clip"
  );

  // The service
  $server->register(
    "GetClipList",
    array(),
    array(
      "clips" => "tns:ClipList"
    ),
    "urn:MyNamespace",
    "urn:MyNamespace#GetClipList",
    "rpc",
    "encoded",
    "Retrieves a list of all clips."
  );

Şimdi benim VisualStudio2010 C # projesi ben oluşturulan WSDL dayalı yeni bir hizmet ekledi. VS bana türünde tek bir veri üyesi olan bir sınıf ClipList içeren kullanmak için bir proxy sınıfını yarattı Clip[].

Şimdiye kadar iyi. I GetClipList() Benim proxy Şimdi çağırdığınızda ben olsun CommunicationException bu tip {[(3 bir nesne türü Clip[] bir nesne atamak olamayacağını bana )]}.

Yani bu bir Clip[] içine döndürülen verileri serisi ve şimdi GetClipList yöntemin dönüş türü karşılamak istediğini varsayarak (olurdu ClipList).

Için vekaleten GetClipList() dönüş değerini değiştirirken Clip[] elle uygulama iyi çalışır. Ama bilinen nedenlerle otomatik oluşturulan sınıf değiştirme önlemek istiyor.

Peki, neden bir ClipList örneğini ve veri üyesi doldurmak değil mi? GetClipList, doğrudan bir Clip[] döndürür ve böylece alternatif olarak ya da, neden VS proxy sınıfı oluşturmaz.

2 Cevap

W3C SOAP standart parça okuduktan sonra bir kez daha ben Clip dizi için bu tanım ile geldi:

$server->wsdl->addComplexType(
  "ArrayOfClip",
  "complexType",
  "array",
  "sequence",
  "SOAP-ENC:Array",
  array(),
  array(
    array(
      "ref"            => "SOAP-ENC:arrayType",
      "wsdl:arrayType" => "tns:Clip[]",
      "minOccurs"      => "0",
      "maxOccurs"      => "unbounded"
    )
  ),
  "tns:Clip"
);

Ben aslında zaten wsdl.exe ve vscutil.exe ile daha önceki testlerde olduğu gibi benim kaynağında üzerinden yorumladı böyle bir tanım onunla aynı fikirde değildi vardı. VisualStudio içinde entegre hizmet ithalat ancak bu tanımı gerektirecek gibi görünüyor.

Ben yapı dizi sorunu çözüldü ediyorum:

$server->wsdl->addComplexType(
        'clsDispIds',
        'complexType',
        'struct',
        'sequence',
        '',
        array(
                'id_disp' => array('name' => 'id_disp', 'type' => 'xsd:int'),
                'id_loc' => array('name' => 'id_loc', 'type' => 'xsd:string')
        )
);

// array di clsDispIds
$server->wsdl->addComplexType(
    'arrclsDispIds',
    'complexType',
    'array',
    'sequence',
    '',
    array(
        'item' => array('name' => 'item', 'type'=>'tns:clsDispIds','minOccurs' => '0', 'maxOccurs' => 'unbounded')
    )
);    

$server->register( 
    'GetIdDispCollection',                  // nome operazione
    array('id'=>'xsd:int'),                 // input 
    array('return'=>'tns:arrclsDispIds'),   // output
    NAMESPACE, 
    true,
    'document',
    'literal',
    'restituisce tutti i dispositivi per il canale specificato',
    'http://schemas.xmlsoap.org/soap/encoding/'
);

tepki oluşturulması üzerinde bir hata var ve bu nedenle complexType zorunlu adı "item" var, her dizi elemanı için otomatik tag "item" ekleyebilir NuSOAP

Bu php, java tarafından doğru serisi oluyor benim yanıttır . Net

stdClass Object ( 
[return] => stdClass Object ( 
    [item] => Array ( [0] => stdClass Object ( [id_disp] => 11718 [id_loc] => '') 
              [1] => stdClass Object ( [id_disp] => 11722 [id_loc] => '') 
              [2] => stdClass Object ( [id_disp] => 11723 [id_loc] => '') 
              [3] => stdClass Object ( [id_disp] => 11724 [id_loc] => '') 
            ) ) )