En ASP.NET es muy fácil realizar peticiones Ajax, tanto Get y Post mediante jQuery, empleando ya sea Handlers (.ashx), como Servicios basados en SOAP (.asmx y WCF), como Servicios basados en HTTP (mediante WebAPI).
SOAP es un un protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML.
HTTP es un protocolo de comunicación basado en texto que se utiliza para solicitar páginas web desde un servidor web y enviar respuestas de nuevo a un navegador web. Cuando se solicita una página web, el navegador envía una solicitud al servidor Web.
Un controlador HTTP (.ashx) es básicamente un proceso que se ejecuta en respuesta a una solicitud realizada a una aplicación Web ASP.NET. La respuesta puede ser una imagen, un html, un json, un xml, etc.
EJEMPLO #1: (El usuario ingresa su edad y el Servidor válida si es mayor o menor de edad y responde con un mensajito de modo asíncrono). No se harán validaciones, pero es un factor muy importante a tener en cuenta que no se nos puede olvidar.
Creamos un WebForm (.aspx)
Agregamos un campo de entrada (<input>) y un enlace (<a>) que se comportará como botón gracias a jQuery.
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
-
- <!DOCTYPE html>
-
- <html>
- <head runat="server">
- <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
- <title></title>
- </head>
- <body>
- <form id="form1" runat="server">
- <input id="edad" type="text" value="" />
- <a id="aceptar" href="#">Validar</a>
- </form>
- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>
- <script type="text/javascript">
- $("#aceptar").click(function (event) {
- event.preventDefault();
- $.post("Handler.ashx", {
- edad: $("#edad").val()
- }, function (msg) {
- alert(msg.mensaje);
- });
- });
- </script>
- </body>
- </html>
Nota : En este ejemplo estamos realizando un POST, si quisiéramos realizar un GET se puede de la siguiente manera
- $.getJSON("Handler.ashx?edad=" + $("#edad").val(), function (msg) {
- alert(msg.mensaje);
- });
La diferencia entre un POST y un GET se basa en como se envían los datos, en el POST los datos se colocan en el cuerpo del mensaje de la solicitud, mientras que en el GET los datos se adjuntan a la URL como parte de la cadena de consulta. Por lo tanto un POST es más seguro y la cantidad de datos que se pueden enviar es mucho mayor.
Ahora agregamos nuestro Handler
El Handler será como el siguiente
- <%@ WebHandler Language="C#" Class="Handler" %>
-
- using System;
- using System.Web;
-
- public class Handler : IHttpHandler
- {
- public void ProcessRequest(HttpContext context)
- {
- int edad = Convert.ToInt32(context.Request["edad"].ToString());
- context.Response.ContentType = "application/json";
- if (edad > 18)
- {
- context.Response.Write(string.Format("{{ \"mensaje\" : \"{0} es mayor\" }}", edad));
- }
- else
- {
- context.Response.Write(string.Format(@"{{ ""mensaje"" : ""{0} es menor"" }}", edad));
- }
- context.Response.End();
- }
-
- public bool IsReusable
- {
- get
- {
- return false;
- }
- }
-
- }
Podemos observar que a la petición le llegará la edad ingresada por el Usuario y se retornará un mensaje en json dependiendo si es mayor o menor. Con solo esto ya tendremos nuestra aplicación comunicándose con nuestro servidor mediante ajax. Aunque es un ejemplo muy simple, en el Handler se podría hacer CRUD a una base de datos y retornar datos, etc.
Estos Servicios a diferencia de los Handlers, solo responden a una petición en formato JSON o XML, según se indique en el código y por defecto es en XML. En un mismo archivo .asmx pueden existir varios métodos web.
Por lo tanto vamos a realizar el EJEMPLO anterior de los Handlers pero con los Servicios Web.
Agregamos un WebService .asmx dentro del sitio Web.
El cual se verá de la siguiente manera
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Script.Services;
- using System.Web.Services;
-
- /// <summary>
- /// Summary description for WebService
- /// </summary>
- [WebService(Namespace = "http://tempuri.org/")]
- [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
- // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
- [System.Web.Script.Services.ScriptService]
- public class WebService : System.Web.Services.WebService {
-
- public WebService () {
-
- //Uncomment the following line if using designed components
- //InitializeComponent();
- }
-
- [WebMethod]
- [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
- public string GetData(int edad)
- {
- if (edad > 18)
- {
- return string.Format("{{ \"mensaje\" : \"{0} es mayor\" }}", edad);
- }
- else
- {
- return string.Format(@"{{ ""mensaje"" : ""{0} es menor"" }}", edad);
- }
- }
-
- }
Y para que nuestro WebForm Default.aspx consuma este WebService solo tenemos que cambiar nuestro script para definir que los datos se enviaran en formato JSON mediante el método genérico AJAX proporcionado por jQuery, por lo tanto se vera de la siguiente manera:
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
- <!DOCTYPE html>
- <html>
- <head runat="server">
- <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
- <title></title>
- </head>
- <body>
- <form id="form1" runat="server">
- <input id="edad" type="text" value="" />
- <a id="aceptar" href="#">Validar</a>
- </form>
- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>
- <script type="text/javascript">
- $("#aceptar").click(function (event) {
- event.preventDefault();
- $.ajax({
- type: "POST",
- url: "WebService.asmx/GetData",
- data: "{edad:" + $("#edad").val() + "}",
- contentType: "application/json; charset=utf-8",
- dataType: "json",
- success: function (msg) {
- if (msg.hasOwnProperty('d')) {
- msg = msg.d;
- }
- var json = JSON.parse(msg);
- alert(json.mensaje);
- },
- error: function (xhr, status, error) {
- alert("Upps! Hubo un error");
- }
- });
- });
- </script>
- </body>
- </html>
1c4d94a3-b8b3-4ec6-a35e-cd7ce7fb834b|6|4.2|96d5b379-7e1d-4dac-a6ba-1e50db561b04