Menu

WebMethods

mayo 29, 2012 - ASP.NET, jQuery

Introducción

Las llamadas asíncronas a Webservices hechas con librerías de terceros son muy comunes hoy día, el uso de JavaScript y la proliferación de AJAX han hecho de esto una necesidad, pero para utilizar ajax básicamente todo método al que debemos llamar debe ser de un webservice  lo cual nos limira en cuanto a la lógica de negocio haciendo que ésta este encapsulada en un webservice, pero ¿y si lo que necesito es simplemente cargar un combo de manera asíncrona?, ¿Debo crear un Webservice solo para eso?, la respuesta es NO, para eso llegan al rescate los WebMethods!.

Un WebMethod no es más que un método en un archivo .cs o .vb que se decora con [WebMethod] o [WebMethod()] y por tanto se comporta como un webservice, y puede ser llamado tanto desde el código .NET como por un script.

Resultado

Como siempre en este blog muestro primero el resultado del proyecto para que se les haga agua la boca.

Demo

Proyecto

Por supuesto el proyecto para que lo descarguen y puedan ‘manosearlo’.

WebMethods

Requerimientos

Manos a la obra!

Bueno, primero lo primero la ayuda de MSDN dice:

El atributo WebMethod se asocia a un método Public para indicar que se desea exponer dicho método como parte del servicio Web XML. También se pueden utilizar las propiedades de este atributo para configurar aún más el comportamiento del método de servicio Web XML

En otras palabras el metodo queda expuesto como webservice listo para ser consumido, si se desea leer más al respecto puede hacer clic aqui.

Lo primero que haremos será maquetar nuestra página de ejemplo

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True">
 </asp:ScriptManager>
 Valor:
 <asp:TextBox ID="txtValor" runat="server"></asp:TextBox>
 <br />
 <asp:Button ID="btnLlamadoNormal" runat="server" OnClick="btnLlamadoNormal_Click"
 Text="Llamado normal" />
 <a ID="lblObtenerPorWebmethod" href="#">Obtener por webmethod</a>
 <br />
 <br />
 <asp:Label ID="lblResultado" runat="server" Text="Resultado: "></asp:Label>

Que realmente no tiene nada del otro mundo, una caja de texto, un botón, un hipervínculo, y un Label, tal vez lo único recalcable aquí sea el ScriptManager que debe tener la propiedad de EnablePageMethods en true. Ahora veamos el code-behind:

	protected void btnLlamadoNormal_Click(object sender, EventArgs e)
    {
		lblResultado.Text += DevuelveValorEnLetras(txtValor.Text);
    }

	[WebMethod]
	public static String DevuelveValorEnLetras(String numero)
	{
		String resultado;
		switch (numero)
		{
			case "1":
				resultado = "Uno";
				break;
			case "2":
				resultado = "Dos";
				break;
			case "3":
				resultado = "Tres";
				break;
			case "4":
				resultado = "Cuatro";
				break;
			case "5":
				resultado = "Cinco";
				break;
			default:
				resultado = "N/A";
				break;
		}
		return resultado;
	}

La sencillez del método viene dada a forma didáctica para no escatimar en ejemplos complejos, tampoco nada marciano a excepción de la decoración del método DevuelveValorEnLetras con [WebMethod] y que el método esta declarado como publico y estático que son requisitos para los WebMethods.

por último la llamada asíncrona con jQuery, que es como cualquier otra:

	$(document).ready(function () {
		// Add the page method call as an onclick handler for the div.
		$("#lblObtenerPorWebmethod").click(function () {
			$.ajax({
				type: "POST",
				url: "Default.aspx/DevuelveValorEnLetras",
				data: "{'numero': '" + $("#txtValor").val() + "'}",
				contentType: "application/json; charset=utf-8",
				dataType: "json",
				success: function (result) {
					$("#lblResultado").text(result.d);
				}
			});
		});
	});

Conclusión

Los WebMethods son una gran alternativa para no poner TODA nuestra lógica de negocios en un webservice, su utilización apenas cambia nuestro código y nos ayuda a mantener todo organizado en la capa correspondiente.

Happy coding!

4 pensamientos sobre “WebMethods

gerard

excelente articulo, los webmetods son una manera interesante tambien como codigamente hablando, negocialmente hablando.. ya que en ves de vender aplicaciones puede vender servicios web.. que realicen tareas determinadas o a medida..:D

Respuesta
Eduardo

Gracias por comentar gerard, pero recuerda que no estamos hablando de webservices sino de un método en nuestra página que actúa como webservice.

Respuesta
Angelo

Acá les dejo un post donde se explica como poder guardar como logs en archivos xml los mensaje soap de un webservice, es muy útil.

http://systemdeveloperpy.blogspot.com/2014/02/traza-xml-de-solicitud-soap-respuesta.html

Respuesta
Huicho Kike

¿Es necesario que un método Web (WebMethod) le regrese algo al cliente o no?. Es decir ¿Puedo crear un método Web con la siguiente firma:
[WebMethod]
public static void MiMetodoWeb()?

Respuesta

Deja un comentario

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