как настроить пространства имен Soap Response ядра Aspnet - PullRequest
0 голосов
/ 22 января 2019

Я создал конечную точку SOAP на стороне сервера, используя Soap-Core (ядро aspnet). Но мне нужно установить пространства имен для ответа (запрос идет отлично).

Итак, у меня есть контракт на обслуживание:

    public interface IToaProducerService
    {
        [OperationContract(Name = "send_message", Action = "agent_service/send_message")]
        [return: MessageParameter(Name = "send_message_response")]
        List<MessageResponseDTO> send_message(UserDTO user, MessagesDTO messages);
    }

С этим я получаю следующий ответ:

<s:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <send_messageResponse xmlns="urn:toatech:agent">
         <send_message_response>
            <MessageResponseDTO>
               <message_id>3138306</message_id>
               <status>sent</status>
            </MessageResponseDTO>
         </send_message_response>
      </send_messageResponse>
   </s:Body>
</s:Envelope>

Но мне нужно, чтобы ответ выглядел так:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:toatech:agent">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:send_message_response>
         <urn:message_response>
            <urn:message_id>3138306</urn:message_id>
            <urn:status>sent</urn:status>
         </urn:message_response>
      </urn:send_message_response>
   </soapenv:Body>
</soapenv:Envelope>

Я использую SoapSerializer.XmlSerializer в файле startup.cs. app.UseSoapEndpoint<ToaProducerService>("/producer", new BasicHttpBinding(), SoapSerializer.XmlSerializer);

Итак, у меня есть некоторые проблемы, которые необходимо решить:

1 - send_message_response и все дочерние элементы должны иметь пространство имен «urn:»

2 - я не могу переопределить имя MessageResponseDTO

MessageResponseDTO:

[XmlRoot(ElementName = "message_response", Namespace = "urn:toatech:agent")]
    [XmlType(Namespace = "urn:toatech:agent")]
    public class MessageResponseDTO
    {
        [XmlElement(Namespace = "urn:toatech:agent")]
        public string message_id;

        [XmlElement(Namespace = "urn:toatech:agent")]
        public string status;

        [XmlElement(Namespace = "urn:toatech:agent")]
        public string description;
    }

Для запроса я использовал тот же подход (используя XmlRoot с пространством имен и XmlElements), и он отлично работает.

...