У меня проблемы с форматом, требуемым нашим клиентом в веб-сервисе с сообщениями SOAP 1.1, это то, что он ожидает:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body >
<m:PingResponse xmlns:m="http://www.mycompany.com/service" Token="E30ED3AA-65DE-48F9-BEA4-BA021B119625" Echo="Hello!" Status="Successful" />
</SOAP-ENV:Body >
</SOAP-ENV:Envelope >
И это то, что у меня есть до сих пор
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<PingRequestResponse xmlns="http://www.mycompany.com/service">
<m:PingResponse Token="E30ED3AA-65DE-48F9-BEA4-BA021B119625" Status="Success" xmlns:m="http://www.mycompany.com/service" />
</PingRequestResponse>
</soap:Body>
</soap:Envelope>
Вот как я реализую
[WebService(Namespace = "http://www.mycompany.com/service")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MyService : System.Web.Services.WebService
{
[WebMethod]
public PingResponse PingRequest([XmlAttribute] string Token)
{
//do stuffs
if (success) {
return new PingResponse { Token = Token, Status = "Success" };
}
else {
return new PingResponse { Token = Token, Status = "Failed", Error = new Error { Code = "NoConnection", Message = "Can't reach the server" } };
}
}
}
[XmlRoot(ElementName = "PingResponse", Namespace = "http://www.mycompany.com/service")]
public class PingResponse
{
[XmlNamespaceDeclarations]
public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
[XmlAttribute]
public string Token { get; set; }
[XmlAttribute]
public string Status { get; set; }
[XmlElement(ElementName = "Error", Namespace = "http://www.mycompany.com/service")]
public Error Error { get; set; }
public PingResponse()
{
xmlns.Add("m", "http://www.mycompany.com/service");
}
}
[DataContract(Namespace = "http://www.mycompany.com/service")]
public class Error
{
[XmlAttribute]
public string Code { get; set; }
[XmlAttribute]
public string Message { get; set; }
}
Итак, как вы можете видеть в моем ответе, это дополнительный элемент Xml с именем PingRequestResponse, сгенерированный WebService с форматом MethodNameResponse, ранее также у меня был другой элемент с именем PingRequestResult< /strong> ниже PingRequestResponse, но мне удалось удалить его с помощью [XmlRoot(ElementName = "PingResponse", в моем классе
Итак, мне нужно сделать следующее:
- Удалите элемент PingRequestResponse и поместите PingResponse непосредственно под телом.
- Измените пространство имен для сообщения SOAP (конверт и тело) на «SOAP-ENV».
- Удалите xsi и xsd из сообщения SOAP.
Любая помощь будет оценена, спасибо.
ИЗМЕНИТЬ:
До сих пор у меня не было WSDL, так что пока это не вариант