sirve - wcf visual studio 2017
Definir esquema de respuesta WCF XML (1)
Construyo un servicio WCF Rest para proporcionar datos para otro proceso. supongamos que su nombre es GetData. Éste proporciona una respuesta xml que tiene esta estructura:
<?xml version="1.0" encoding="utf-8"?>
<GetDataResponse xmlns="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetDataResult>
<DataMessage>
<a></a>
<b></b>
<c></c>
</DataMessage>
</GetDataResult>
</GetDataResponse>
la interfaz de servicio:
[XmlSerializerFormat]
[OperationContract(Name = "GetData")]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "Data/{Param}")]
List<DataMessage> GetData(string Params);
Me gustaría deserializar el xml después de guardarlo, siguiendo la clase DataMessage. Entonces, me gustaría tener este esquema:
<?xml version="1.0" encoding="utf-8"?>
<DataMessages xmlns="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DataMessage>
<a></a>
<b></b>
<c></c>
</DataMessage>
</DataMessages>
¿Qué debo hacer para definir el esquema de respuesta del servicio para tenerlo así?
Gracias.
Puede usar algunos atributos en el espacio de nombres System.Xml.Serialization
para definir un gráfico de objetos que se asigna al esquema que tiene. El código a continuación hace eso.
public class _7905186
{
[XmlType(TypeName = "DataMessage", Namespace = "http://tempuri.org/")]
public class DataMessage
{
public string a;
public string b;
public string c;
}
[XmlRoot(ElementName = "DataMessages", Namespace = "http://tempuri.org/")]
public class DataMessages
{
[XmlElement(ElementName = "DataMessage")]
public List<DataMessage> Messages;
}
[ServiceContract]
public class Service
{
[XmlSerializerFormat]
[OperationContract(Name = "GetData")]
[WebGet(ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "Data/{Param}")]
[return: MessageParameter(Name = "DataMessages")]
public DataMessages GetData(string Param)
{
return new DataMessages
{
Messages = new List<DataMessage>
{
new DataMessage
{
a = "1",
b = "2",
c = "3",
}
}
};
}
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
host.Open();
Console.WriteLine("Host opened");
WebClient c = new WebClient();
Console.WriteLine(c.DownloadString(baseAddress + "/Data/foo"));
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}