C# Soap XML SerializationException при синтаксическом анализе объекта

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

Исключение:

An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in System.Runtime.Serialization.dll

Additional information: Error in line 1 position 687. Element 'http://soap.sforce.com/2005/09/outbound:sObject' contains data from a type that maps to the name 'urn:sobject.enterprise.soap.sforce.com:Contact'. The deserializer has no knowledge of any type that maps to this name. Consider using a DataContractResolver if you are using DataContractSerializer or add the type corresponding to 'Contact' to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding it to the list of known types passed to the serializer.

 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>[email protected]</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; }
    }

Какой тип сообщения?

spodger 19.12.2018 12:41

@spodger это сообщение SOAP, я использую WCF для его анализа

Ramesh 19.12.2018 12:51

Вы проверяли наличие службы REST для того, что делаете? Если бы он был, было бы намного проще.

Crowcoder 19.12.2018 12:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
238
2

Ответы 2

Проблема, описанная в исключении, заключается в следующем объявлении типа и пространства имен для 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; }

Вы только объявляете пространство имен «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>

Другие вопросы по теме