2013-09-04 2 views
3

Я использую стандартный wsdl (расположенный here) для связи с сервисом (OpenXDS). Я создал ссылку на службу, которая создала очень большой файл Reference.cs. В файле есть иерархия типов:wcf клиент игнорирует производные типы во время десериализации

public partial class ExtrinsicObjectType : RegistryObjectType 

. . .

[System.Xml.Serialization.XmlIncludeAttribute(typeof(ExtrinsicObjectType))] 
public partial class RegistryObjectType : IdentifiableType 

. . .

[System.Xml.Serialization.XmlIncludeAttribute(typeof(RegistryObjectType))] 
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ExtrinsicObjectType))] 
public partial class IdentifiableType : object 

Все три типа имеют одинаковую XmlType:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0")] 

Там есть коллекция в типе реагирования объектов IdentifiableType:

[System.Xml.Serialization.XmlArrayAttribute(Namespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0", Order=0)] 
[System.Xml.Serialization.XmlArrayItemAttribute("Identifiable", IsNullable=false)] 
public IdentifiableType[] RegistryObjectList { 

Когда служба на самом деле отвечает, это дает сбор элементов внешних элементов:

<rim:RegistryObjectList xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0"> 
    <ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ... 
    <ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ... 
    <ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ... 
    <ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ... 
    <ns1:ExtrinsicObject xmlns:ns1="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" ... 
</rim:RegistryObjectList> 

Я вижу эти элементы в журнале трассировки, и я могу получить тот же ответ в SoapUI. Но когда я получаю десериализованный ответ от клиентского прокси, RegistryObjectList пуст. Он полностью игнорирует элементы ExtrinsicObject.

Я не могу изменить сервер, а клиент создан VS2012. Кажется, это должно работать, и я пропускаю какую-то настройку или что-то в этом роде.

Вот теории у меня до сих пор:

  • Там какая-то установка на ссылки на службу, и если я проверил и обновил код всё будет работать.
  • wsdl, который я использую, отличается от wsdl, с которым они согласились.
  • Мне нужно выяснить, как вручную десериализовать ответы.

Любая помощь приветствуется. Я попытался включить то, что, как я думал, было уместным, но было много редактирования, поскольку wsdl, xsd и Reference.cs все довольно большие.

+0

В этом случае я пытаюсь построить сервер CUCH с сервером WSDL и посмотреть, как отклик от него отличается от того, который отправляет настоящий сервер. –

+0

Ссылка на wsdl не работает .... –

+0

Кажется, он отрезал конец. Используйте https://code.google.com/p/epsos-common-components/source/browse/ihe-profiles/src/wsdl/XCARespondingGatewayQuery.wsdl?r=e6bea12e067eb13d9276b8da7c9667a45ec5685f – qanwi1970

ответ

0

Я только что получил эту работу, передавая следующий XmlAttributeOverrides к сериализатору:

var overrides = new XmlAttributeOverrides(); 
overrides.Add(typeof(SubmitObjectsRequest), "RegistryObjectList", new XmlAttributes 
{ 
    XmlArray = new XmlArrayAttribute() 
    { 
     Namespace = "urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0", 
     Order = 0 
    }, 
    XmlArrayItems = 
    { 
     new XmlArrayItemAttribute("ExtrinsicObject", typeof(ExtrinsicObjectType)) { IsNullable = false }, 
     new XmlArrayItemAttribute("RegistryPackage", typeof(RegistryPackageType)) { IsNullable = false } 
    } 
}); 

Из того, что я понимаю, Reference.cs, как вы сказали, это дает:

[System.Xml.Serialization.XmlArrayAttribute(Namespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0", Order=0)] 
[System.Xml.Serialization.XmlArrayItemAttribute("Identifiable", IsNullable=false)] 
public IdentifiableType[] RegistryObjectList { 

Но так , в XML элемент RegistryObjectList не имеет Identifiable дочерних узлов, а ExtrinsicObject и RegistryPackage детей, что я действительно хочу, чтобы он выглядел так:

[System.Xml.Serialization.XmlArrayAttribute(Namespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0", Order=0)] 
[System.Xml.Serialization.XmlArrayItemAttribute("ExtrinsicObject", typeof(ExtrinsicObjectType), IsNullable=false)] 
[System.Xml.Serialization.XmlArrayItemAttribute("RegistryPackage", typeof(RegistryPackageType), IsNullable=false)] 
public IdentifiableType[] RegistryObjectList { 

Включение переопределений приводит к тому, что сериализатор игнорирует исходные атрибуты и обрабатывает RegistryObjectList, как если бы был украшен последним.

Смежные вопросы