Подтвердить что ты не робот

WCF: тип прокси-сервера на клиенте

У меня есть следующий тип в 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>
4b9b3361

Ответ 1

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

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

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

Edit

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

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

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

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

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

Ответ 2

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