Я создал конечную точку 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), и он отлично работает.