viernes, 31 de julio de 2009

Web Service: ¿Service1 is not define?

Hice un web service que permite comunicar código javascript con un método que existe en el web service, éste se ejecuta en forma asíncrona. En el código javascript está el siguiente código de ejemplo:

function btnEnviar_onclick() {
var resultado = Service1.HelloWorld(document.getElementById("txtNombre").value,
OnComplete, OnTimeOut, OnError);
return true;
}

function OnComplete(arg) {
alert(arg);
}

function OnTimeOut() {
alert("Time is up");
}

function OnError() {
alert("Error");
}

El problema es que estoy consiguiendo el error "Service1 is not define". Existe cinco cosas importantes que hay que tomar en cuenta:

1º - El web service debe estar corriendo, ¡obvio!
2º - El nombre del directorio donde está el web service debe ser utilizado en el momento de instanciar o llamar a un método del web service.
3º - Por supuesto, también es importante agregar el control ScripManager a la página *.aspx y dentro de ese control agregar un ServiceReference.
4º Si aun no aparece, entonces revizar el código Javascript y verificar que los nombres de los métodos OnComplete, OnTimeOut y OnError estén bien escritos en todo lado donde se vayan a usar. Recordemos que Javascript es sencible a mayúsculas y minúsculas.
5º Si se están usando WebService estáticos, el método debe ser declarado con la palabra reservada Shared (VB) o static (C#).
6º Puede ocurrir que el web service es llamado pero se lanza una excepción indicando que no encuentra al web service y por más que intente hacerlo funcionar, no ocurre. Un caso así ocurrió cuando se ejecutaba una aplicación en una máquina virtual. La solución fue simplemente reiniciar la máquina virtual. Sí por supuesto, dicha solición se aplicó casí después de tres horas después de tantos intentos infructuosos, jaja!

7º Existe un caso especial, pero ocurre solo si utilizamos Web Services Estáticos.El mensaje de error equivalente con el que podemos toparnos es el siguiente:
   Error: Sys.Net.WebServiceFailedException: The server 
   method 'StaticMethod' failed with the following error: 
   Archivo de origen: http://localhost:10258/WebSite2
   /ScriptResource.axd?d=58xHtP0kV6y42p9jtK_IzqsHQXnRb-
   2ldpNeZlGfSlZEESQ9GeHLihiyxiP1&t=d2c0a1c Línea: 5488

Eso es por una única razón. Se produce si un botón que se 
supone llama a una función de JS y la función de JS llama 
a una función stática en el lado del servidor, es muy 
probable que la función sí se pueda ejecutar (la del lado 
del servidor) pero la respuesta de retorno va a fallar ya 
que el botón hace postback haciendo que el otro mensaje 
que se había enviado, falle totalemente.
Y continuando con la solución para el problema anterior del Web Service, lo que hay que hacer es llamar al web service utilizando el nombre del directorio seguido del nombre de la clase web service separado con punto quedando ahora:

var resultado = SimpleWebService.Service1.HelloWorld.....;

Otro punto importante es que debe existir la siguiente línea de código en el encabezado
de la clase:

<System.Web.Script.Services.ScriptService()> _

No hay comentarios: