XElement не объявляется при использовании прокси-службы ссылки на службу с XmlAnyElementAttribute - PullRequest
1 голос
/ 07 октября 2010

Я работаю над приложением Windows Phone 7, которое общается со сторонним сервисом Soap.Я использовал Add Service Reference для wsdl для генерации прокси-класса.Некоторые вызовы работают, но некоторые исходящие вызовы, использующие класс 'sObject', приводят к ошибке "The type System.Xml.Linq.XElement was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically"

Соответствующая часть класса sObject определена (как автоматически сгенерированная)

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:sobject.partner.soap.sforce.com")]
 public partial class sObject : object, System.ComponentModel.INotifyPropertyChanged {

    <snipped ....>

    [System.Xml.Serialization.XmlAnyElementAttribute(Namespace="urn:sobject.partner.soap.sforce.com", Order=3)]
    public System.Xml.Linq.XElement[] Any {
        get {
            return this.anyField;
        }
        set {
            this.anyField = value;
            this.RaisePropertyChanged("Any");
        }
    }

Код, который я использую для создания sObject:

sObject post = new sObject();
        XElement postEls = new XElement("sObject",
            new XElement("Type", "TextPost"),
            new XElement("ParentId", userInfo.userId),
            new XElement("Body", postBody)
            );

        post.Any = postEls.Elements().ToArray();

Шаги, которые я пробовал:

Добавление [System.Xml.Serialization.XmlInclude(typeof(System.Xml.Linq.XElement))] к классу sObject.Та же ошибка, похоже, это должно было сработать.

Добавление [System.Xml.Serialization.XmlElement()] к свойству Any.Когда я сделал это, сообщение было сериализовано, но, как и ожидалось, некорректно (элементы Any не должны быть там, цель - просто XElements [] в качестве вывода)

 <sObject>
      <type xmlns="urn:sobject.partner.soap.sforce.com">FeedPost</type>
      <Id xsi:nil="true" xmlns="urn:sobject.partner.soap.sforce.com" />
      <Any xmlns="urn:sobject.partner.soap.sforce.com">
        <Type xmlns="">TextPost</Type>
      </Any>
      <Any xmlns="urn:sobject.partner.soap.sforce.com">
        <ParentId xmlns="">XXXXXX</ParentId>
      </Any>
      <Any xmlns="urn:sobject.partner.soap.sforce.com">
        <Body xmlns="">Test post from WP7!</Body>
      </Any>
    </sObject>

В целом, я подозреваюэто связано с тем, что вызовы, которые возвращают sObject-ы, входящие из сторонней службы, имеют свойство Any со значением NULL, несмотря на данные, присутствующие в ответе RPC.

1 Ответ

1 голос
/ 07 октября 2010

Оказывается, исключение было связано с сериализацией XElement [], в настоящее время проблема в Windows Phone 7.

Как отметил Виджай Верма здесь , связанная статья MSDN о XmlSerializer.Serialize заявляет в Примечаниях платформы:

Silverlight для Windows Phone: Метод XmlSerializer.Serialize создает исключение InvalidOperationException, если объект XmlSerializer инициализируется параметром типа, который содержит массив объектов типа XElement.

Виджай перечислил обходной путь использования одного XElement и парсинга поля отдельно. Это будет работать, если вы контролируете обе стороны сообщения SOAP. К сожалению, я этого не делаю, поэтому запрос стороннего производителя недействителен.

Это объясняет, что InvalidOperationException с XElement не ожидался, хотя и не тот ответ, на который я надеялся. Надеюсь, это поможет кому-то еще, кто может контролировать обе стороны службы.

...