Форматировать SOAP-сообщение в asmx WebService

У меня проблемы с форматом, требуемым нашим клиентом в веб-сервисе с сообщениями 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, так что пока это не вариант


person Heybrajham    schedule 03.11.2017    source источник
comment
Попросите WSDL и выполните подход сверху вниз.   -  person Namphibian    schedule 03.11.2017
comment
Да, я уже запрашивал WSDL несколько дней назад, но до сих пор не   -  person Heybrajham    schedule 03.11.2017


Ответы (1)


В прошлом я провел много времени, борясь с библиотекой Net, добавляя пространства имен xml. Когда другой метод не работает, я просто разбираю нужную мне строку. Гораздо чище

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


namespace ConsoleApplication13
{
    class Program
    {

        static void Main(string[] args)
        {
            string xmlStr =
                "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" >" +
                   "<SOAP-ENV:Body >" +
                      "<m:PingResponse xmlns:m=\"http://www.derbysoft.com/chapaai\"  />" +
                   "</SOAP-ENV:Body >" +
                "</SOAP-ENV:Envelope >";

            XElement envelope = XElement.Parse(xmlStr);
            XElement response = envelope.Descendants().Where(x => x.Name.LocalName == "PingResponse").FirstOrDefault();

            response.Add(new XAttribute("Token", "E30ED3AA-65DE-48F9-BEA4-BA021B119625"));
            response.Add(new XAttribute("Echo", "Hello"));
            response.Add(new XAttribute("Status", "Successful"));
        }

    }

}
person jdweng    schedule 03.11.2017