C # Soap XML SerializationException при анализе объекта - PullRequest
0 голосов
/ 19 декабря 2018

Когда я пытаюсь проанализировать мыло xml для объектов, я получаю исключение ниже, не уверенный, что я делаю неправильно.

Исключение:

Произошло необработанное исключение типа 'System.Runtime.Serialization.SerializationException' в System.Runtime.Serialization.dll

Дополнительная информация: ошибкав строке 1 позиция 687. Элемент 'http://soap.sforce.com/2005/09/outbound:sObject' содержит данные из типа, который сопоставляется с именем' urn: sobject.enterprise.soap.sforce.com: Contact '.Десериализатор не знает ни одного типа, который сопоставляется с этим именем.Рассмотрите возможность использования DataContractResolver, если вы используете DataContractSerializer или добавляете тип, соответствующий «Контакту», в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавляя его в список известных типов, передаваемых сериализатору.

 static void Main(string[] args)
    {

        string inputString = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?> <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"> <soapenv:Body> <notifications xmlns=\"http://soap.sforce.com/2005/09/outbound\"> <SessionId xsi:nil=\"true\"/> <EnterpriseUrl>https://hultibs--FullDev.cs10.my.salesforce.com/services/Soap/c/44.0/00DJ0000003QX7f</EnterpriseUrl> <PartnerUrl>https://hultibs--FullDev.cs10.my.salesforce.com/services/Soap/u/44.0/00DJ0000003QX7f</PartnerUrl> <Notification> <Id>04lJ000000PoRS2IAN</Id> <sObject xsi:type=\"sf:Contact\" xmlns:sf=\"urn:sobject.enterprise.soap.sforce.com\"> <sf:Id>0033600001koT9qAAE</sf:Id> <sf:Email>tcampbell2018@maili.com</sf:Email> <sf:Student_ID__c>5192435</sf:Student_ID__c> </sObject> </Notification> </notifications> </soapenv:Body> </soapenv:Envelope>";


        FromXml(inputString);
        Console.ReadLine();
    }

 public static void FromXml(string Xml)
    {
        using (var reader = XmlReader.Create(new StringReader(Xml)))
        {
            Message m = Message.CreateMessage(reader, int.MaxValue, MessageVersion.Soap11);
            var body = m.GetBody<Notifications>();
            Console.WriteLine(body);
        }

    }
[DataContract(Name = "sObject", Namespace = "http://soap.sforce.com/2005/09/outbound")]
    public class SObject
    {
        [DataMember(Name = "Id", Order = 1)]
        public string Id { get; set; }
        [DataMember(Name = "Email", Order = 2)]
        public string Email { get; set; }
        [DataMember(Name = "Student_ID__c", Order = 3)]
        public string Student_ID__c { get; set; }
        [DataMember(Name = "type", Order = 4)]
        public string Type { get; set; }
        [DataMember(Name = "sf", Order = 5)]
        public string Sf { get; set; }
    }

    [DataContract(Name = "Notification", Namespace = "http://soap.sforce.com/2005/09/outbound")]
    public class Notification
    {
        [DataMember(Name = "Id", Order = 1)]
        public string Id { get; set; }
        [DataMember(Name = "sObject", Order = 2)]
        public SObject SObject { get; set; }
    }

    [DataContract(Name = "notifications", Namespace = "http://soap.sforce.com/2005/09/outbound")]
    public class Notifications
    {

        [DataMember(Name = "ActionId", Order = 2)]
        public string ActionId { get; set; }
        [DataMember(Name = "EnterpriseUrl", Order = 3)]
        public string EnterpriseUrl { get; set; }
        [DataMember(Name = "PartnerUrl", Order = 4)]
        public string PartnerUrl { get; set; }
        [DataMember(Name = "Notification", Order = 5)]
        public Notification Notification { get; set; }
    }

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы объявляете только пространство имен "http://soap.sforce.com/2005/09/outbound" в вашем DataContract, вы можете использовать Message.CreateMessage для сериализации ваших уведомлений и сравнения вашего xml с сериализованным сообщением.

Ниже приведен код.

static void Main(string[] args)
    {
        Notifications notifications = new Notifications()
        {
            ActionId = "actionId",
            EnterpriseUrl = "enterpriceUri",
            PartnerUrl = "parentUri",
            Notification = new Notification
            {
                Id = "abc",
                SObject = new SObject
                {
                    Email = "email",
                    Id = "id",
                    Sf = "sf",
                    Student_ID__c = "a",
                    Type = "type"
                }
            }
        };
        Message me = Message.CreateMessage(MessageVersion.Soap11, "www.abc.com", notifications);  // create a message and serialize the notifications into the message
        WriteMessage(me, @"d:\message.xml");


    }
    static void WriteMessage(Message message, string fileName)
    {

        using (XmlWriter writer = new XmlTextWriter(fileName, Encoding.UTF8))
        {
            message.WriteMessage(writer);// write the message into a file
        }
        Process.Start(fileName);// show the file
    }

И сериализованное сообщение.

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">www.abc.com</Action></s:Header><s:Body><notifications xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://soap.sforce.com/2005/09/outbound"><ActionId>actionId</ActionId><EnterpriseUrl>enterpriceUri</EnterpriseUrl><PartnerUrl>parentUri</PartnerUrl><Notification><Id>abc</Id><sObject><Id>id</Id><Email>email</Email><Student_ID__c>a</Student_ID__c><type>type</type><sf>sf</sf></sObject></Notification></notifications></s:Body></s:Envelope>
0 голосов
/ 19 декабря 2018

Проблема, которая описана в исключении, заключается в следующем объявлении типа и пространства имен для sObject в сообщении мыла

<sObject xsi:type=\"sf:Contact\" xmlns:sf=\"urn:sobject.enterprise.soap.sforce.com\">

, поскольку в этом пространстве имен не определен класс Contact (или любой другой).

Если вы удалите объявление типа и пространства имен из sObject в сообщении мыла (и удалите префикс sf: из его членов), оно должно работать ОК.

Или удалить xsi:type=\"sf:Contact\и измените DataContract на

[DataContract(Name = "sObject", Namespace = "urn:sobject.enterprise.soap.sforce.com")]

Или оставьте мыльное сообщение, как есть, и измените

    [DataContract(Name = "sObject", Namespace = "http://soap.sforce.com/2005/09/outbound")]
    public class SObject

на

    [DataContract(Name = "Contact", Namespace = "urn:sobject.enterprise.soap.sforce.com")]
    public class Contact

, также изменяющийся (в Уведомлении)

        [DataMember(Name = "sObject", Order = 2)]
        public SObject SObject { get; set; }

до

        [DataMember(Name = "sObject", Order = 2)]
        public Contact SObject { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...