WCF: тип прокси коллекции на клиенте - PullRequest
12 голосов
/ 04 марта 2010

У меня есть следующий тип в wsdl (он генерируется сторонним инструментом):

<xsd:complexType name="IntArray">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:int" /> 
  </xsd:sequence>
</xsd:complexType>

Иногда Visual Studio генерирует:

public class IntArray : System.Collections.Generic.List<int> {}

И иногда он не генерирует прокси-тип для этого wsdl и просто использует int [].

Тип коллекции в конфигурации веб-службы - System.Array.

В чем может быть причина такого непредсказуемого поведения?

Отредактировано:

Я нашел способ, как я могу воспроизвести это поведение.

Например, у нас есть два типа:

<xsd:complexType name="IntArray">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:int" /> 
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="StringArray">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:string" /> 
  </xsd:sequence>
</xsd:complexType>

VS генерирует:

public class IntArray : System.Collections.Generic.List<int> {}

public class StringArray : System.Collections.Generic.List<string> {}

Теперь я меняю тип StringArray:

<xsd:complexType name="StringArray">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Elements" type="xsd:string" /> 
    <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="lax" />
  </xsd:sequence>
  <xsd:anyAttribute namespace="##any" processContents="lax"/>
</xsd:complexType>

VS генерирует тип прокси только для StringArray. Но не для IntArray.

Отредактировано:

Reference.svcmap:

  <ClientOptions>
    <GenerateAsynchronousMethods>false</GenerateAsynchronousMethods>
    <EnableDataBinding>true</EnableDataBinding>
    <ExcludedTypes />
    <ImportXmlTypes>false</ImportXmlTypes>
    <GenerateInternalTypes>false</GenerateInternalTypes>
    <GenerateMessageContracts>false</GenerateMessageContracts>
    <NamespaceMappings />
    <CollectionMappings />
    <GenerateSerializableTypes>true</GenerateSerializableTypes>
    <Serializer>Auto</Serializer>
    <ReferenceAllAssemblies>true</ReferenceAllAssemblies>
    <ReferencedAssemblies />
    <ReferencedDataContractTypes />
    <ServiceContractMappings />
  </ClientOptions>

Ответы [ 2 ]

9 голосов
/ 09 марта 2010

Если вы просматриваете все файлы для проекта, а затем просматриваете файл с именем Reference.svcmap для соответствующей справочной службы, не могли бы вы сообщить мне, какие следующие параметры конфигурации имеются в xml?

<ExcludedTypes />
<ImportXmlTypes>false</ImportXmlTypes>
<GenerateInternalTypes>false</GenerateInternalTypes>
<GenerateSerializableTypes>false</GenerateSerializableTypes>
<Serializer>Auto</Serializer>

Извините, что вставил это как ответ, но это было ужасно нечитаемо в комментариях.

Редактировать

Хорошо, вот что происходит здесь:

  1. Вы используете auto для сериализатора.
  2. По умолчанию используется DataContractSerializer
  3. При генерации прокси-кода проверяется наличие запрещенных элементов xsd.
  4. Если найдены запрещенные элементы, используется XmlSerializer.

В вашем случае добавление элемента xsd: any приводит к изменению режима сериализации. Если вы хотите последовательной сериализации, вам придется удалить запрещенный элемент или заставить генерацию прокси все время использовать XmlSerialization.

Здесь - ссылка о допустимых элементах схемы для DataContractSerializer.

Приветствие -Leigh

0 голосов
/ 04 марта 2010

Насколько я знаю, прокси-классы генерируются SvcUtil.exe, почему вы не смотрите на это с отражателем ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...