Consumir wcf con android primera parte

Bienvenido a este nuevo tutorial de android. Hoy aprenderemos a como consumir servicios web (RESTFUL) con android, para ello usaremos:
  1. Visual studio 2012. 
  2. Android studio. 
  3. SQL Server. 
Para iniciar hablemos sobre el proyecto: El proyecto es un sistema de autentificación. En la cual usaremos WCF(Windows comunication fundation) como servicios web para consumir los recursos de un servidor. De igual forma el formato json para el intercambio de datos y SQL Server para el alojamiento de los datos.

Paso 1: Creamos la base de datos y sus tablas.

Creamos una base llamada DB_Login que contenga una  tabla llamada tb_login con una columna llamada usuarios y la otra llamada contrasena los dos de tipo texto(nvarchar).
create database DB_Registro
go
use DB_Registro
go
create table tb_login(
usuario nvarchar(200),
contrasena nvarchar(200)
)
go
insert into tb_login values('usuario1','contrasena1')

Paso 2: Crear nuevo proyecto wcf.

FILE >> NEW >> Project.


Installed >> Visual C# >> WCF >> WCF Service Application >> Ok.

nota: No se olvide de asignarle un nombre en nuestro caso se llama WebService


Paso 3: Eliminar código de la interfaz IService1.cs.

En la interfaz IService1.cs  eliminaremos los códigos en rojo que son lo que te dan por default.

using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WebService
{
    [ServiceContract]
    public interface IService1
    {

        [OperationContract]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);
    }
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
}


Dando como resultado:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WebService
{
    [ServiceContract]
    public interface IService1
    {

    }
}


Paso 4: Implementar el OperationContract

El primer atributo a utilizar es [ServiceContract], este atributo indica que el interfaz es un contrato de WCF. Ahora debemos de indicar que operaciones soporta este contrato, para ello utilizamos el atributo [OperationContract] en cada uno de los métodos que queremos que el servicio exponga.
Dentro interface IService1 anexaremos la siguiente definición.

[OperationContract]
[ WebInvoke(Method = "GET",   ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
                    UriTemplate = "usuario/{id}/contrasena/{pass}")]
List<respuesta>Login(string id, string pass);
Dando como resultado:
namespace WebService
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "GET",
                    ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
                    UriTemplate = "usuario/{id}/contraseña/{pass}")]
               List<respuesta> Login(string id, string pass);
    }
}

OperationContract: indica la operación a realizar por el método.
WebInvoke: Se emplea cuando necesitamos recibir información de un servicio o consultamos a un modelo de servicio REST
ResponseFormat: Utilizamos WebMessageFormat.Json para definir que el formato de respuesta sea en formato json.


BodyStyle: Denotamos que el cuerpo se de estilo wrapped que significa que la respuesta estará visible en la respuesta.
UriTemplate: especifica una URL que incluya parámetros que deben sustituirse antes de que se resuelva la URL.
List<Login> Login: Se encargara de procesar las operaciones solicitadas desde la url.
retornando un objeto tipo login(en formato json).

Paso 5: Implementar el Objeto login

Este objeto se encargará de procesar los datos en formato json.
public class respuesta
    {
        public string res { get; set; }
    }

Paso 6: Eliminar código de la clase Service1.svc.cs

Eliminaremos los códigos que se nos dan por default en nuestro caso es lo que esta marcado de rojo.

using System;
namespace WebService
{
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
              throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
           return composite;
        }  
     }
 }
Resultado:
using System;
namespace WebService
{
    public class Service1 : IService1
    {

    }
}

Paso 7: Vincular interface IService1 con la clase Service1 e implementar sus métodos.


using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

namespace WebService
{
   public class Service1 : IService1
    {
        List<respuesta> listarespuesta = new List<respuesta>();
        public List<respuesta> Login(string id, string pass)
        {
            SqlConnection con = new SqlConnection(@"Data Source=KEYLI-PC; database=DB_Registro; integrated security = true"); // making connection   
            con.Open();
            SqlDataAdapter sda = new SqlDataAdapter("SELECT count(*) from tb_login where usuario='" + id + "' and contrasena='" + pass + "'", con);
            DataTable dt = new DataTable();  
            sda.Fill(dt);
            if (dt.Rows[0][0].ToString() == "1")
            {
                this.listarespuesta.Add(new respuesta()
                {
                    res = "success"
                });
            }
            else
            {
                this.listarespuesta.Add(new respuesta()
                {
                    res = "Error"
                });
            }
            return listarespuesta;
        }
    }
}

Explicación:
Definimos una lista de tipo objeto(respuesta) para guardar los datos en  formato json.
 List<respuesta> listarespuesta = new List<respuesta>();
Ahora creamos un método llamándolo igual al que se encuentra en la interface IService1.cs que haga referencia al contrato.
public List<respuesta> Login(string id, string pass){}
1.- Creamos conexión con SqlConnection.
SqlConnection con = new SqlConnection(@"Data Source=KEYLI-PC; database=DB_Registro; integrated security = true");
2.- Abrimos conexion.
con.Open();
3.- Ejecutamos sintaxis sql con SqlDataAdapter.
SqlDataAdapter sda = new SqlDataAdapter("SELECT count(*) from tb_login where usuario='" + id + "' and contrasena='" + pass + "'", con);
4.- Inicializamos una Data table.
DataTable dt = new DataTable();  
5.- Guardamos en DataTable los resultados de SqlDataAdapter.
sda.Fill(dt);
6.- Condicionamos si se encuentra algún registro.
if (dt.Rows[0][0].ToString() == "1")
7.- Es el proceso de respuesta en formato json.
this.listarespuesta.Add(new respuesta()
   {
      res = "success"
   });
8.- procesamos respuesta de error si no existe ningun registro.
this.listarespuesta.Add(new respuesta()
   {
      res = "error"
   });
20. regresamos la lista.
return listarespuesta;

Paso 8: configurar webconfig.

Ahora vamos a controlar cómo funciona nuestro web service para eso añadiremos la sintaxis marcadas con  rojo.
Para obtener mas información sobre los componentes webconfig ver aqui
<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
      <services>
        <service name="WebService.Service1" behaviorConfiguration="myServiceBehavior" >
          <endpoint name="webHttpBinding"

                    address="" binding="webHttpBinding"

                    contract="WebService.IService1"

                    behaviorConfiguration="webHttp"

                  >
          </endpoint>
          <endpoint name="mexHttpBinding"

                    address="mex"

                    binding="mexHttpBinding"

                    contract="IMetadataExchange"

                  />
        </service>
      </services>
    <behaviors>
      <serviceBehaviors>
        <behavior  name="myServiceBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttp">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="webHttpBinding" scheme="https"  />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

Paso 7: Resultado.

Notemos que los datos los estamos enviando mediante la url. y el web service nos retorna una respuesta en formato json.


Tutoriales siguientes.