我已经使用Soap-Core(aspnet核心)创建了一个服务器端SOAP端点。 但是我需要为响应设置名称空间(请求进展顺利)。
所以,我有这份服务合同:
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>
我在startup.cs中使用了SoapSerializer.XmlSerializer
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一起使用),并且效果很好。