Как получить необработанные разделы XML из сериализованного ответного сообщения в формате NET - PullRequest
0 голосов
/ 20 июня 2020

У меня есть ответ XML, возвращенный веб-службой. NET. API, используемый для ответа на возврат, является сериализованным ответом, и он удаляет дополнительный раздел XML, поскольку он не является частью сериализованного стека классов, который я не могу изменить в API. Есть ли способ получить необработанный ответ XML, чтобы я мог получить раздел Additional: AdditionalData моего ответного сообщения или каким-то образом просто получить сам раздел Additional: AdditionalData XML?

Вызов API службы - это TestPort.TestPortType response = service.GetTestPortList (), а возвращаемый ответ не содержит дополнительного раздела, поскольку он не является частью стека TestPort.TestResponse.

Это сообщение Raw XML, возвращенное через Fiddle Analyzer:

    <TestResponse xmlns="urn:oasis:names:tc:legalxml-filing:schema:xsd:TestResponse-4.0" xmlns:org="urn:org:ecf:extensions:Common" xmlns:j="http://niem.tech/niem/domains/jxdm/4.0" xmlns:s="http://niem.tech/niem/structures/2.0" xmlns:nc="http://niem.tech/niem/niem-core/2.0" xmlns:ecf="urn:oasis:names:tc:legalxml-filing:schema:xsd:CommonTypes-4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <ecf:Error>
            <ecf:ErrorCode>0</ecf:ErrorCode>
            <ecf:ErrorText>No Error</ecf:ErrorText>
          </ecf:Error>
          <supplemental:supplementalData xmlns:supplemental="urn:oasis:names:tc:legalxml-filing:schema:xsd:supplementalData-4.0">
            <nc:TestID>DATest159647</nc:TestID>
          </supplemental:supplementalData>
    </TestResponse>

Это сообщение XML, возвращаемое API, которое является сериализованным ответом, поэтому, поскольку раздел additionalmental: additionalData не является частью сериализованного ответа, он игнорируется.

    <TestResponse xmlns="urn:oasis:names:tc:legalxml-filing:schema:xsd:TestResponse-4.0" xmlns:org="urn:org:ecf:extensions:Common" xmlns:j="http://niem.tech/niem/domains/jxdm/4.0" xmlns:s="http://niem.tech/niem/structures/2.0" xmlns:nc="http://niem.tech/niem/niem-core/2.0" xmlns:ecf="urn:oasis:names:tc:legalxml-filing:schema:xsd:CommonTypes-4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <ecf:Error>
            <ecf:ErrorCode>0</ecf:ErrorCode>
            <ecf:ErrorText>No Error</ecf:ErrorText>
          </ecf:Error>
    </TestResponse>

Это раздел XML, к которому я пытаюсь получить доступ из своего хостингового приложения. Net после того, как ответ будет возвращен, но он удаляется из возвращенного сериализованного ответа.

    <supplemental:supplementalData xmlns:supplemental="urn:oasis:names:tc:legalxml-filing:schema:xsd:supplementalData-4.0">
            <nc:TestID>DATest159647</nc:TestID>
    </supplemental:supplementalData>

Ответы [ 2 ]

0 голосов
/ 23 июня 2020

Если серверная сторона перехватывает сообщение SOAP, ей необходимо реализовать интерфейс IDispatchMessageInspector.

public class ServerMessageLogger : IDispatchMessageInspector
    {
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {

            Console.WriteLine(request);
            return null;
        }

        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            Console.WriteLine(reply);
        }
    }

Запрос - это сообщение SOAP, полученное серверной стороной со стороны клиента. . Если клиентская сторона перехватывает сообщение SOAP, ей необходимо реализовать интерфейс IClientMessageInspector.

 public class ClientMessageLogger : IClientMessageInspector
    {
        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
            Console.WriteLine(reply);
        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            Console.WriteLine(request);
            return null;
        }
    }

Нам нужно добавить класс, реализующий IDispatchMessageInspector или IClientMessageInspector, к поведению на стороне сервера или на стороне клиента.

 [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, AllowMultiple = false)]
    public class CustContractBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute,IOperationBehavior
    {
        public Type TargetContract => throw new NotImplementedException();

        public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
            return;
        }

        public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
        {
            throw new NotImplementedException();
        }

        public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
        }

        public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
        {
            throw new NotImplementedException();
        }

        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
            dispatchRuntime.MessageInspectors.Add(new ServerMessageLogger());
        }

        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
            
        }

        public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
        {
            return;
        }

        public void Validate(OperationDescription operationDescription)
        {
            throw new NotImplementedException();
        }
    }

Наконец, нам нужно применить это поведение к службе.

    [CustContractBehavior]
    public interface IService1
    {...
0 голосов
/ 20 июня 2020

Использование Xml Linq. Я прочитал строку из файла. Вы можете использовать аналогичный код, чтобы получить строку ответа и создать x-документ.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            XDocument doc = XDocument.Parse(xml);

            XElement supplementalData = doc.Descendants().Where(x => x.Name.LocalName == "supplementalData").FirstOrDefault();
            XNamespace supplemental = supplementalData.GetNamespaceOfPrefix("supplemental");
            XNamespace nc = supplementalData.GetNamespaceOfPrefix("nc");

            string TestID = (string)supplementalData.Element(nc + "TestID");

        }
    }
}
...