Как указать последовательность элементов вместо массива элементов в .NET WCF Web Service? - PullRequest
0 голосов
/ 09 июня 2011

У меня есть веб-сервис .NET 4 WCF, который принимает контракт данных с необязательным перечисляемым набором строк. Например:

Сервисный код:

[DataMember(IsRequired = true)]
public string Something {
    get { return _Something; }
    set { _Something= value; }
}
private string _Something;

[DataMember(IsRequired = false)]
public string[] MoreThings {
    get { return _MoreThings.ToArray<string>(); }
    set { _MoreThings  = new List<string>(value); }
}
private List<string> _MoreThings = new List<string>();

WSDL:

  <xsd:complexType name="MyDataContract">
    <xsd:sequence>
      <xsd:element minOccurs="1" name="Something" type="xsd:string" /> 
      <xsd:element minOccurs="0" name="MoreThings" nillable="true" type="q1:ArrayOfstring" xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
    </xsd:sequence>
  </xsd:complexType>

Я пытаюсь взаимодействовать со службой с разных платформ, но одна из них - Perl, использующая SOAP :: WSDL (и в частности wsdl2perl.pl), которая, похоже, не может распознать «ArrayOfstring». Могу ли я что-нибудь сделать в своем коде, чтобы WSDL читалось так:

  <xsd:complexType name="MyDataContract">
    <xsd:sequence>
      <xsd:element minOccurs="1" name="Something" type="xsd:string" /> 
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="MoreThings" nillable="true" type="xsd:string" /> 
    </xsd:sequence>
  </xsd:complexType>

Я также открыт для других предложений. По сути, я пытаюсь сделать что-то похожее на объявление метода MyOperation (string что-то, params string [] moreThings), где может быть передано любое количество дополнительных параметров moreThings, но таким образом, что это не вызывает проблем взаимодействия с не Платформы .NET.

1 Ответ

3 голосов
/ 09 июня 2011

Я думаю, что вы не можете достичь этого с DataContractSerializer - вы должны переключиться на XmlSerializer.Вы можете просто взять нужную вам схему и позволить инструментам (запустить командную строку VS) сгенерировать класс для вас.

  • Для DataContractSerizlizer используйте: svcutil.exe /dataContractsOnly File.xsd, но, как я упоминал ранее, я не думаю, что DataContract может представлять вашу схему
  • Для XmlSerializer используйте: xsd.exe /classes File.xsd

Получив файл класса, просто добавьте его в проект службы и используйте в операциях службы.В случае XmlSerializer вы должны пометить либо весь контракт на обслуживание / реализацию, либо контракты / реализации на обслуживание, используя типы, сгенерированные XSD.exe с атрибутом XmlSerializerFormat.

...