Augusto Humire Martinez web blog

algo de web-in

RestFull con WCF y devolviendo JSON o XML

La idea principal contiene dos temas, el primero crear un servicio Rest creando un controlador que exponga los recursos del servicio utilizando RESTFull, el segundo tema es devolver los resultados en formato JSON o XML, dependiendo de la necesidad que Ud. tenga.

En principio la idea es mas sencilla de lo que parece, muchos tutores hablan de exponer JSON con REST pero no encontré mucho material al respecto y tampoco eran claros en la forma del como. y como no queria olvidar de como lo hice aqui una ayuda memoria que les puede servir tambien a Uds.

Este tutorial no contiene  teoria de REST, es preciso lea antes de usar este tutorial un poco de teoria sobre REST, para llevar este tutorial es preciso que tenga algunos conocimientos basicos de los que es un servicio web, algo de ASP.Net y un poco de WCF, si no los tiene no importa aventurese probablemente lo logre, sin embargo tambien les dejo las fuentes comprimidos en rar (cambiar la extension jpg por rar) para que lo puedan ver y revisar.

Para bajar la aplicacion completa de ejemplo haga click aqui y cambie la extension jpg por rar (wordpress no permite insertar archivos que no sean de imagenes).

Ensamblados Requeridos:

using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;

Paso 1:

Crear un nuevo proyecto “WCF Service Application”,

Imagen

Paso 2:

Borrar los archivos IService1 y Service1 desde el explorador de la soluciones y agregue una clase con nombre RestService.cs y una interface con el nombre IRestService.cs

Imagen

Paso 3: 

Crear una clase llamada Persona

Imagen

[DataContract]
public class Persona
{
[DataMember]
public string DNI;

[DataMember]
public string Nombres;

[DataMember]
public string ApellidoPaterno;

[DataMember]
public string ApellidoMaterno;
}

Adicionalmente se requiere agregar una referencia al namespace System.Runtime.Serialization 

Paso 4: 

Dentro de la interface IRestService  escribiremos el siguiente codigo

Imagen

[OperationContract]
[WebInvoke(Method = “GET”, ResponseFormat = WebMessageFormat.Json, UriTemplate = “”)]
List<Persona> GetAllPersona();

[OperationContract]
[WebInvoke(Method = “GET”, ResponseFormat = WebMessageFormat.Json, UriTemplate = “{dni}”)]
Persona GetPersonaByDNI(string dni);

[OperationContract]
[WebInvoke(Method = “POST”, UriTemplate = “”)]
Persona AddPersona(Persona persona);

[OperationContract]
[WebInvoke(Method = “PUT”, UriTemplate = “set?dni={dni}”)]
Persona SetPersona(string dni, Persona newPersona);

[OperationContract]
[WebInvoke(Method = “DELETE”, UriTemplate = “del?dni={dni}”)]
int DelPersona(string dni);

Paso 6: 

En la clase RestService inserte el siguiente codigo

List<Persona> _personaList = new List<Persona>();

private List<Persona> GetList()
{
return new List<Persona>()
{
new Persona(){ DNI = “98765412”, Nombres = “Debora”, ApellidoPaterno = “Meltrozo”, ApellidoMaterno = “Rosado” },
new Persona(){ DNI = “45678945”, Nombres = “Rosa”, ApellidoPaterno = “Meltrozo”, ApellidoMaterno = “Duro” },
new Persona(){ DNI = “32178945”, Nombres = “Rosa”, ApellidoPaterno = “Melano”, ApellidoMaterno = “Rosado” },
new Persona(){ DNI = “14785236”, Nombres = “Juana”, ApellidoPaterno = “Lajo”, ApellidoMaterno = “Diaz” },
new Persona(){ DNI = “12345678”, Nombres = “Augusto”, ApellidoPaterno = “Supo”, ApellidoMaterno = “Tito” },
};
}

public List<Persona> GetAllPersona()
{
return this.GetList();
}

public Persona GetPersonaByDNI(string dni)
{
return this.GetList().FirstOrDefault(x => x.DNI.Equals(dni));
}

public Persona AddPersona(Persona persona)
{
_personaList.Add(persona);
return persona;
}

public Persona SetPersona(string dni, Persona newPersona)
{
Persona persona = new Persona();
persona = _personaList.FirstOrDefault(x => x.DNI.Equals(dni));
if (persona != null)
{
persona.DNI = newPersona.DNI;
persona.ApellidoPaterno = newPersona.ApellidoPaterno;
persona.ApellidoMaterno = newPersona.ApellidoMaterno;
}
return persona;
}

public int DelPersona(string dni)
{
return _personaList.RemoveAll(x => x.DNI.Equals(dni));
}

Paso 7: 

Debemos agregar compatibilidad con ASP.NET para ello decoramos la clase RestService con

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

entonces la clase RestService debera de quedar asi

Imagen

Paso 8:

Agregue un archivo Global.asax y en el evento Application_Start rutearemos el servicio entonces el evento quedaria asi

Imagen

protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new ServiceRoute(“restServicePersona”, new WebServiceHostFactory(), typeof(RestService)));
}

Donde restServicePersona sera la direccion del controlador y RestService es el nombre del Tipo a rutear

La configuración de
En el web.config borre todo lo que esta dentro de <system.serviceModel> e inserte la siguiente configuracion

Imagen

<serviceHostingEnvironment aspNetCompatibilityEnabled=”true”>
</serviceHostingEnvironment>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name=””
helpEnabled=”true”
automaticFormatSelectionEnabled=”false”
defaultOutgoingResponseFormat =”Json”>
</standardEndpoint>
</webHttpEndpoint>
</standardEndpoints>

Paso 9:

Ejecute la aplicacion y habra un browser y haga la llamada a Rest atraves de http usando la direccion http://localhost:XXXXX/restServicePersona/ donde el resultado será

[{"ApellidoMaterno":"Rosado","ApellidoPaterno":"Meltrozo","DNI":"98765412","Nombres":"Debora"},{"ApellidoMaterno":"Duro","ApellidoPaterno":"Meltrozo","DNI":"45678945","Nombres":"Rosa"},{"ApellidoMaterno":"Rosado","ApellidoPaterno":"Melano","DNI":"32178945","Nombres":"Rosa"},{"ApellidoMaterno":"Diaz","ApellidoPaterno":"Lajo","DNI":"14785236","Nombres":"Juana"},{"ApellidoMaterno":"Tito","ApellidoPaterno":"Supo","DNI":"12345678","Nombres":"Augusto"}]

para ver un usario en especifico podemos usar la direccion

http://localhost:XXXXX/restServicePersona/45678945

y nos devuelve la persona con dni = 45678945    y el resultado será

{"ApellidoMaterno":"Duro","ApellidoPaterno":"Meltrozo","DNI":"45678945","Nombres":"Rosa"}

si desea ver los recursos disponibles escriba http://localhost:XXXX/restServicePersona/help y obtendrá

Imagen

Esta aplicacion devuelve resultados en formato JSON si desea devolver XML solo requiere configurar el archivo web.config y cambiar la linea

automaticFormatSelectionEnabled=”false”

y debera quedar como

automaticFormatSelectionEnabled=”true”

sin embargo solo en caso de querer obtener XML

y obtendria el siguiente resultado

<ArrayOfPersona xmlns=”http://schemas.datacontract.org/2004/07/RestFull&#8221; xmlns:i=”http://www.w3.org/2001/XMLSchema-instance”><Persona><ApellidoMaterno>Rosado</ApellidoMaterno><ApellidoPaterno>Meltrozo</ApellidoPaterno><DNI>98765412</DNI><Nombres>Debora</Nombres></Persona><Persona><ApellidoMaterno>Duro</ApellidoMaterno><ApellidoPaterno>Meltrozo</ApellidoPaterno><DNI>45678945</DNI><Nombres>Rosa</Nombres></Persona><Persona><ApellidoMaterno>Rosado</ApellidoMaterno><ApellidoPaterno>Melano</ApellidoPaterno><DNI>32178945</DNI><Nombres>Rosa</Nombres></Persona><Persona><ApellidoMaterno>Diaz</ApellidoMaterno><ApellidoPaterno>Lajo</ApellidoPaterno><DNI>14785236</DNI><Nombres>Juana</Nombres></Persona><Persona><ApellidoMaterno>Tito</ApellidoMaterno><ApellidoPaterno>Supo</ApellidoPaterno><DNI>12345678</DNI><Nombres>Augusto</Nombres></Persona></ArrayOfPersona&gt;

Todas las tildes fueron omitidas a discrescion.

mayo 11, 2013 - Posted by | Uncategorized

4 comentarios »

  1. Muy bueno el post, pero tengo una consulta como hago para probar el addPerson, necesito agregar una nueva persona y no se como hacerlo.
    Me podrías ayudar.
    Saludos

    Comentario por Gonzalo | enero 10, 2014

  2. Muy originales los apellidos en los ejemplos

    Comentario por erickorlando | diciembre 30, 2015

  3. el serviceroute me aparece en rojo no me lo reconoce y no se porque

    Comentario por Anónimo | abril 20, 2016

  4. hola, tengo una solucion que debo entregar en archivo. xml o tambien json, pero los datos los tengo dentro de una archivo.dat me gustaria recibir alguna ayuda.
    gracias.

    Comentario por juan | marzo 13, 2017


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: