Consumo de servicio ASMX con Xamarin

Consumo de servicio ASMX con Xamarin

Uno de los servicios más conocidos y utilizados en el mundo .NET es el servicio ASMX (utilizando el protocolo SOAP), si bien es cierto esta forma de crear servicios ha quedado obsoleta (más bien, reemplazada por otras nuevas) se sigue utilizando en nuestros días.

Resulta sencilla su creación y consumo, pero tiene algunos problemas de autenticación propias del protocolo SOAP. En esta entrada mostraré cómo consumir un servicio web SOAP desde una aplicación Xamarin.Android.

Para comenzar necesitamos un servicio web SOAP publicado (vía internet o de manera local). Para este ejemplo, utilizaremos un servicio web que se encuentra disponible en la Web (al momento de escribir esta entrada el servicio se encuentra funcionando). La dirección es: http://www.dneonline.com/calculator.asmx

Como verás es una calculadora, por lo cual, necesitaremos 2 número para realizar el cálculo y mostrar el resultado en un Toast.

El diseño de la aplicación lo presentaremos de esta manera, en el archivo Main.axml:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="Primer número"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView1" />
<EditText
android:inputType="number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/num1" />
<TextView
android:text="Segundo número"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView2" />
<EditText
android:inputType="number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/num2" />
<Button
android:text="Sumar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnSumar" />
</LinearLayout>

Llamada Sincrónica

Aquí el servicio se consume de manera directa y se espera por el resultado. La clase MainActivity.cs quedaría de la siguiente manera:


using Android.App;
using Android.Widget;
using Android.OS;

namespace PruebaServicioWeb
{
[Activity(Label = "PruebaServicioWeb", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
EditText num1;
EditText num2;
Button btnSumar;

protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView (Resource.Layout.Main);

num1 = FindViewById<EditText>(Resource.Id.num1);
num2 = FindViewById<EditText>(Resource.Id.num2);
btnSumar = FindViewById<Button>(Resource.Id.btnSumar);

btnSumar.Click += BtnSumar_Click;
}

private async void BtnSumar_Click(object sender, System.EventArgs e)
{
//Llamar al servicio web
var proxy = new ServicioWeb.Calculator();
int n1, n2, resultado;
n1 = int.Parse(num1.Text);
n2 = int.Parse(num2.Text);

//Realizamos la llamada al método del servicio web
resultado = proxy.Add(n1, n2);
Toast.MakeText(this.BaseContext, resultado.ToString(),
ToastLength.Long).Show();
}
}
}

Llamada Asincrónica

Aquí el servicio se consume de manera directa y el resultado se retorna cuando esté disponible. La clase MainActivity.cs quedaría de la siguiente manera:


using Android.App;
using Android.Widget;
using Android.OS;

namespace PruebaServicioWeb
{
[Activity(Label = "PruebaServicioWeb", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
EditText num1;
EditText num2;
Button btnSumar;

protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);

// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);

num1 = FindViewById<EditText>(Resource.Id.num1);
num2 = FindViewById<EditText>(Resource.Id.num2);
btnSumar = FindViewById<Button>(Resource.Id.btnSumar);

btnSumar.Click += BtnSumar_Click;
}

private async void BtnSumar_Click(object sender, System.EventArgs e)
{
//Llamar al servicio web
var proxy = new ServicioWeb.Calculator();
int n1, n2;
n1 = int.Parse(num1.Text);
n2 = int.Parse(num2.Text);

//Crear llamada al método asincrónico para sumar.
proxy.AddAsync(n1, n2);

// Evento que espera por el resultado
proxy.AddCompleted += Proxy_AddCompleted;
}

private void Proxy_AddCompleted(object sender,
ServicioWeb.AddCompletedEventArgs e)
{
if (e.Error == null)
{
int resultado = e.Result;
Toast.MakeText(this.BaseContext, resultado.ToString(),
ToastLength.Long).Show();
}
}
}
}

De esta manera, consumimos de dos maneras distintas un servicio web SOAP para utilizarlo en nuestra aplicación Xamarin.

Un comentario sobre “Consumo de servicio ASMX con Xamarin

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.