Iniciando con OWIN, el inicio de algo grande.

Hola que tal?, en esta serie de Post me voy a enfocar de una manera práctica a este nuevo “bicho” que está apareciendo, y que se va a quedar por un buen rato, que es OWIN. Si no sabes lo que es, te recomiendo que leas los siguientes Links antes de seguir:

Bueno, asumo que ya los leíste, si no, voy a hacer un pequeño resumen de por que es necesario una implementación de este tipo, y la justificación no es inventada por mí, si no voy a escribir lo que dice el Team de ASP.NET.

ASP.NET ha estado presente aproximadamente 10 años, y sin duda a permitido la creación de muchas y muy buenas web apps, (Sitios y Servicios). Pero ya las estrategias de desarrollo han evolucionado, y si bien ASP.NET Web API y MVC responden  a esta evolución de excelente manera, hay que dar un paso más en esta evolución, es aquí donde aparece el proyecto Katana, el cual proporciona un conjunto de componente para las aplicaciones ASP.NET que le permite ser flexible, ligero, portátil y proporcionar un mejor rendimiento, todo esto pensado para la nube.

Luego de haber leído los artículos anteriores, se nos viene a la cabeza de inmediato node.js, que llamó la atención de inmediato con la sencillez de este framework para crear y ejecutar un servidor web. Bueno, los objetivos de katana se enmarcan a la luz de Node.js, no hay misterio ni problemas al reconocerlo,resumir que Katana trae mucho de los beneficios de Node.js sin forzarnos a los desarrolladores, tirar todo lo que ya sabemos de las aplicaciones con ASP.NET. Entonces la idea es que empezar con el proyecto Katana debe ser igual de fácil que introducirse en Node.js.

Vamos a comenzar con el código, y verás, al igual que tú , estoy aprendiendo, así que espero que nada resulte a la primera, ya que encuentro de mucha utilidad, aprender de los errores.

 

image

 

Luego debemos instalar el paquete de Microsoft.Owin.Host.SystemWeb, el cual nos proporciona un servidor OWIN que ejecuta las canalizaciones de solicitudes de ASP.NET (si no tienes claro esto, insisto, lee los artículos Sonrisa)

image

Se van a instalar dependencias como la Microsoft.Owin, que provee helpers y métodos para desarrollar aplicaciones OWIN. Podemos utilizar estos helpers para crear rápidamente un servidor que responda “Hola Mundo”. Vamos a crear una clase y se llamará Startup, puedes notar que se instaló un template:

image

Con lo cual nos crea la estructura básica y le vamos agregar un poco más de código:

 

using System;

using System.Threading.Tasks;

using Microsoft.Owin;

using Owin;

 

[assembly: OwinStartup(typeof(Demo1.Startup))]

 

namespace Demo1

{

    public class Startup

    {

        public void Configuration(IAppBuilder app)

        {

            app.Run(context =>

            {

               context.Response.ContentType = «text/html»;

               return context.Response.WriteAsync(«<h1> Hola Mundo!!</h1>»);

            });

        }

    }

}

Al ejecutarlo tendremos el siguiente resultado:

image

Y si, igual de sencillo que Node.js, pero sigamos avanzando. Una de las máximas de OWIN es que exista una des acoplamiento de componentes como el IIS, es decir, al contrario del ejemplo anterior, que ocupamos la canalización de request de ASP.NET, el cual se soporta en System.Web. Esto de todas maneras no es para nada malo, de hecho añade un gran valor, ya que nos permite tener la flexibilidad y composición de pipeline de OWIN combinado con las capacidades de gestión y madurez de IIS.  Pero hay otros escenarios, en donde no es necesario IIS, por ejemplo , es posible que necesitemos que un servicio del SO tenga una puerta escuchando peticiones Web para configuración , y no queremos tener montado un IIS o un apache solo para eso, si no que el mismo servicio sea el host.

Pasar de portar el host desde IIS a una app de linea de comandos, vamos a requerir agregar un nuevo paquete nuget con el servidor y sus dependencias para iniciar el host bajo esta modalidad. Para esto vamos a tener nuestro servidor en un host Katana llamado OwinHost.exe, y utilizaremos un HTTPListener basado en Katana. Paso siguientes entonces en crear una app de consola y agregar los paquetes correspondientes:

image

Agregamos una clase de partida quedando así:

using Microsoft.Owin.Hosting;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace KatanaDemo2

{

    class Program

    {

        static void Main(string[] args)

        {

            using (WebApp.Start<Startup>(«http://localhost:8888»))

            {

             Console.WriteLine(«Presiona una tecla para detener al server»);

             Console.ReadKey();

            }

        }

    }

}

Con esto le estamos diciendo, que escuche los requerimientos por el puerto 8888 de servidor, en este caso mi equipo. Como puedes apreciar , no hay ninguna referencia hacia System.Web. La clase startup es exactamente igual que el escenario anterior, lo probamos y listo!

image

Y esto es solo el inicio, vamos a crear ejemplos mucho más sofisticados, como ves es un cambio grande pero necesario en términos de arquitectura. Así que nos iremos paso a paso.

Espero que te sirva!

Nos vemos @chalalo.

[Sin olvidar] Web Forms, como detectar y redireccionar usuarios móviles.

Hola que tal?, en este post quería abordar el tema de Mobile y Web Forms, ya hemos visto las facilidades que existe con ASP.NET MVC , o con MVVM, en donde tenemos vistas que, debido a que controlamos todo el código generado, podemos fácilmente incluir algún framework como jqueyrmobile. Pero no hay que olvidar que existe una gran cantidad de sitios que utiliza y seguirá utilizando WebForms, de manera que es siempre necesario revisar el tema de como agregar la posibilidad de detectar los dispositivos móviles con esta tecnología y re direccionar a una vista consistente con un navegador móvil.

Una de las opciones que tenemos en tener un crear una Master Page específica, en donde podemos ocupar los mismos formularios, pero separamos en dos MasterPages, una con la vista normal y la otra con la versión móvil, esto nos permite tener estilos CSS y HTML  de nivel superior,(entiéndase doctype y metas específicos para móviles) , todo esto nos evita duplicar la lógica ya desarrollada

protected void Page_PreInit(object sender, EventArgs e)
{
      if (Request.Browser.IsMobileDevice)
             MasterPageFile = "~/Mobile.Master";
}

Ahora bien, el enfoque anterior, si bien es apropiado para ciertos escenarios, puede no ser adecuado cuando dicha lógica o flujo de trabajo de los formularios no se ajusta a una vista móvil, por ejemplo un carro de compras. En este caso vamos a requerir la creación de un WebForm independiente y exclusivo ara la vista móvil. Lo más usual es que creemos  una carpeta con el nombre “Mobilel” para dejar ahí todas las páginas para móviles ahí. Podemos crear un “segundo” sitio completo, con master pages, css, paginas, etc. Además como se supone una lógica simplificada, no es necesario replicar todo el sitio de escritorio y luego modificarlo, solo lo necesario y pueden compartir la misma lógica de negocio que las paginas de escritorio . Como consejo en esta etapa, te recomiendo tener una capa de negocios consistente ente ambas vistas, además de la utilización de WebServices que puedes acceder mediante jquery en vistas totalmente HTML, mucho más liviano que ocupar webcontrols dentro de un formulario móvil.

Generalmente es conveniente hacer la redirección a la vista móvil solo en la primera solicitud de su sesión de navegación, por las siguientes razones:

  • Facilidad para permitir a los usuarios acceder a la vista normal o de escritorio si así lo desean. Típicamente colocamos un link indicando “Versión de Escritorio”. En este caso, no habría redirección y consulta sobre si es un dispositivo móvil por cada postback.
  • Evita el riesgo de interferir con las solicitudes dinámicas de recursos compartidos entre las dos vistas(móvil y escritorio)

Para lo anterior, lo que debemos hacer, en el archivo Global.asax, es implementar en el método Session_start la siguiente lógica:

void Session_Start(object sender, EventArgs e)
       {
          HttpRequest httpRequest = HttpContext.Current.Request;
           if (httpRequest.Browser.IsMobileDevice)
           {
               string path = httpRequest.Url.PathAndQuery;
               bool isOnMobilePage = path.StartsWith("/Mobile/",
                                                     StringComparison.OrdinalIgnoreCase);
               if (!isOnMobilePage)
               {
                   string redirectTo = "~/Mobile/";
                   HttpContext.Current.Response.Redirect(redirectTo);
               }
           }
       }

Como puedes observar, lo primero que se hace es comprobar la información del httpRequest, de manera de verificar si el usuario  está navegando desde un móvil, luego mediante el path, comprobamos si estamos navegando dentro de nuestra sitio móvil, en el caso de que se cumpla de que estamos desde un móvil, pero no lo estamos en la vista móvil, lo re direccionamos a la vista adecuada.

Otro punto importante es el tema de cache de salida, ya que es posible que un usuario que se hubiese encontrado navegando en una pagina “X Escritorio” cause que se almacene cache para esa página, luego un usuario móvil visita la misma página, va a recibir el cache de salida de la página “X Escritorio” en su vista “X Movil”. Para evitar este problema, le podemos indicar a ASP.NET que varíe el cache de salida según si el usuario es móvil o de escritorio. Para esto agregamos en la declaraciones del webform:

<%@ OutputCache VaryByParam="*" Duration="60" VaryByCustom="isMobileDevice" %>

Con esto estamos indicando que vamos a indicar de manera customizada la variación del refresco del cache de salida en memoria, ahora lo que debemos hacer es agregar el siguiente método en el global.asax:

public override string GetVaryByCustomString(HttpContext context, string custom)
{

  if (string.Equals(custom, "isMobileDevice", 
                                            StringComparison.OrdinalIgnoreCase)) 
       return context.Request.Browser.IsMobileDevice.ToString();

return base.GetVaryByCustomString(context, custom);

}

Eso va a asegurar a los visitantes de nuestro sitio que no van a recibir una salida de cache generada por un usuario de escritorio.

Eso!, ven, no hay que olvidarse de WebForms, aun son muchos los desarrolladores que están con esta tecnología, recordemos también que ahora existe un solo ASP.NET, y tu elijes que condimentos tener en tu sitios.

Ver las tablas creadas con Azure Mobile Services desde un cliente REST

Bueno, el titulo ya dice todo, vamos a ver el tema de como manipular los datos de las tablas desde un cliente REST, para esto, vamos a instalar PostMan para Chrome, puedes utilizar cualquier otro cliente, el que gustes.

image

Luego de instalado revisemos brevemente la REST API de Mobilse Services, esta esta basado en la siguiente estructura:

http://Mobileservice.azure-mobile.net/tables/*

En donde Mobileservice.azure corresponde a tu servicio móvil, luego se hace referencia a la tabla y luego a la tabla en particular. Para este ejemplo, utilizaré https://peliculassinet.azure-mobile.net/

Las acciones que vamos a poder realizar (según los permisos de usuarios ) son las siguientes:

image

Como vez, basados en los verbos HTTP, y la forma de acceder es bastante sencilla. Veamos las tabla Películas de mi servicio móvil en el portal:

image

A esta tabla vamos ejecutar las operaciones, pero primero debemos tener la clave del servicio para poder acceder a la API de MS, para eso vamos a al portal del AMS y pinchamos en:
image

Luego se va a abrir un panel de selección de clave:

image

y copio la clave de la aplicación, luego nos vamos a PostMan y seteamos nuestro entorno para poder generar la comunicación, para esto, debemos escribir la URL y muy importante, agregar en el header el Parámetro X-ZUMO-APPLICATION , que va a tener el valor de la llave, sin esto, no tendremos la autorización para acceder a las tablas. Puedes ver más información acá: http://msdn.microsoft.com/en-us/library/windowsazure/jj677198.aspx

image

El Preview del request generado es:

GET /Tables/Peliculas/ HTTP/1.1
Host: peliculassinet.azure-mobile.net
X-ZUMO-APPLICATION: OUkhVzulGEkkSCtMGpkVoQbEpFVJKt97
Cache-Control: no-cache
Postman-Token: 278e4f45-e557-7516-2fe9-fef34c703763

Ahora ya podemos hacer un POST también, así que vamos a setar la opción en post y agregar el JSON

image

Esto de devuelve el mismo objeto, indicándome el id generado y si voy a mi panel, veremos el registro creado:

image

Esto mismo lo puedes hacer con Javascript, Jquery o el framework que quieras, como puedes ver, es bastante sencillo y nos abre muchas posibilidades y escenarios de uso

Saludos!
@chalalo

Material y temas de la Charla de Windows Azure Mobile Services

image

Hola que tal, les quiero compartir el material de la charla de Azure Mobile Services, se que quedaron varios temas fuera, de los que voy a abordar acá en el Blog , como el tema de los permisos sobre las tablas y Auth. Pero por mientras les copio la URL en donde está el video del WebCast:

Pincha acá para ver el video:https://www150.livemeeting.com/cc/MSEvents/view?cn=guest&id=1032559265&pw=3F8D0830

El Demo visto en la charla lo puedes descargar desde acá:

Los artículos relacionados sobre el demo, los encuentras a continuación:

Parte 1: http://geeks.ms/blogs/gperez/archive/2013/07/31/azure-mobile-services-ejemplo-pr-225-ctico-con-html5-js.aspx

Parte 2: http://geeks.ms/blogs/gperez/archive/2013/08/02/comenzando-azure-mobile-services-ejemplo-pr-225-ctico-con-html5-js-parte-2.aspx

Parte 3:http://geeks.ms/blogs/gperez/archive/2013/08/08/comenzando-azure-mobile-services-ejemplo-pr-225-ctico-con-html5-js-parte-3.aspx

Saludos!,
Chalalo

Del Baúl del Recuerdo: Crear Imágenes con ASP.NET WebForm

Hola, entre tanta característica nueva de ASP.NET, de repente son varias las consultas que me llegan sobre algo en particular, en este caso, fue sobre como crear imágenes con Asp.net Webform, y como tuve que hacer algo parecido, aprovecho de escribirlo.

El problema era el siguiente, tenía que ocupar una impresora térmica de pulseras, e imprimir cierta información, si bien en la impresora se pueden enviar comandos, estoy en un cliente web, por lo que solo tenía acceso a window.print, (no tenía acceso a soluciones como las de Crystal Report que, según configuración, utilizan un activeX para enviar los datos a la impresora local). Además como era de pulsera tenia que imprimir de forma vertical, y si, sin depender de la configuración de la impresora ni utilizar CSS3, ya que debía ser compatible conversiones antiguas de IE, ni ocupar scripts. Debe permitir imprimir y cerrar automáticamente la ventana.

Entonces pensé que lo mejor era crear una imagen con el texto que quería y luego rotarla, luego implementar un poco de javascript para cerrar la ventana, veamos como queda esto:

<body onload="imprimir();">

    <form id="form1" runat="server" >

    <div>

      <img runat="server" id="pulsera" /></div>

   </form>

 

</body>

</html>

<script type="text/javascript">

   function imprimir(){

    window.print();

    setTimeout(function () {

        window.close();

    }, 6000);

   }

</script>

Esta es la pantalla que se abre como popup, se que hay mucho mejores formas de hacer esto, pero lo estoy simplificando. Tengo una imagen tiene por id=”pulsera”, y se llama en el onload del body ala función imprimir, la que imprimirá el documento y luego de 6 segundos (pueden bajar el tiempo) va a cerrar la pantalla. El comportamiento ayuda bastamente, se abre la pantalla de impresión y puede que pasen los 6 segundos antes de apretar imprimir, pero debido a que la pantalla de dialogo está abierta, no pagina no se cierra, una vez que pones imprimir, se ejecuta la petición de cerrarla.

Ahora bien, si me preguntan por que no utilicé jquery para esto, respuesta: porque es un despropósito utilizarlo para utilizarlo en un 0,000001%

Veamos el código VB.NET Asociado:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

  If Not Page.IsPostBack Then

    Dim nombre As String = Request("nombre")

    Dim rut As String = Request("rut")

    Dim edad As String = Request("edad")

    Dim estab As String = Request("estab")

    Dim parametros As String = String.Format("?nombre={0}&rut={1}&edad={2}&estab={3}", nombre, rut, edad.Replace(")", "").Replace("(", ""), estab)

    pulsera.Src = "GeneraPulseraIMG.aspx" & parametros

End If

End Sub

Puedes notar que la ruta de la imagen es en realidad una página asp.net a la que se le pasan los parametros necesarios para generar la imagen. Ahora veamos la página generaPulseraIMG.aspx

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            Dim texto As String = Request("texto")

 

        Dim nombre As String = Request("nombre")

        Dim rut As String = Request("rut")

        Dim edad As String = Request("edad")

        Dim estab As String = Request("estab")

 

        Dim objLienzo As Bitmap = New Bitmap(800, 70)

        Dim objGraficar As Graphics = Graphics.FromImage(objLienzo)

        Dim objColor As System.Drawing.Color

        objColor = Color.White

        Dim objFont As New Font("Verdana", 12)

        Dim objCoordenadas As New PointF(50, 10)

        Dim objPincelFondo As New SolidBrush(objColor)

        Dim objPincelTexto As New SolidBrush(Color.Black)

        objGraficar.FillRectangle(objPincelFondo, 0, 0, 800, 70)

 

        ‘TITULO

        objGraficar.DrawString(estab, objFont, objPincelTexto, objCoordenadas)

       

‘PACIENTE

        Dim objCoordenadasPaciente As New PointF(50, 26)

        Dim objFontPaciente As New Font("Verdana", 10)

        objGraficar.DrawString("Paciente:" & nombre, objFontPaciente, objPincelTexto, objCoordenadasPaciente)

 

        ‘TERCERA LINEA

        Dim objCoordenadasTercera As New PointF(50, 40)

        objGraficar.DrawString("Rut:" & rut & " Edad:" & edad & " ", objFontPaciente, objPincelTexto, objCoordenadasTercera)

      

        objLienzo.RotateFlip(RotateFlipType.Rotate270FlipXY)

        Context.Response.ContentType = "image/jpeg"

        objLienzo.Save(Context.Response.OutputStream, ImageFormat.Jpeg)

    End Sub

Puedes ver que esta página es la que genera la imagen utilizando el namespace System.drawing de manera de crear un lienzo,darle dimensiones, y graficar Sonrisa. Grafíco las 3 líneas y luego con RotateFlip, roto la imagen, finalmente el content-type es una imagen, para que pueda ser fuente del objeto imagen de la página anterior y listo (el tema de los tildes solo es codificación):

image

Invitacion a Evento – Webcast MSDN Latam: Aplicaciones Web en la nube con alimentación en Minutos con Windows Azure Mobile Services‏

image

Hola!, los quería invitar a este evento en donde voy a ser speaker, se trata de crear aplicaciones en la nube con Azure Mobile Services, en donde vamos a revisar los conceptos necesarios para comenzar y a a desarrollar una aplicación web móvil que aproveche la potencialidad de esta plataforma. También revisaremos como crear apps con Android y Windows Phone que permitan conectarse a esta plataforma.

Fecha:viernes, septiembre 20, 2013, de 5:00PM a 6:00PM

Los datos para inscribirse!
https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032559265&Culture=es-AR&community=0

Nos vemos ahí!

Tips-Utilizar WebServices con JSONP, ejemplo práctico

Hola que tal, acá algo que te puede servir. Cuando queremos hacer una petición por ajax, y estamos en otro dominio, te podrás haber percatado que el server envía un bonito mensaje “Access to restricted URI denied”, y es que por motivos de seguridad parece lógico, cuando todo esto partió, que Ajax no funcione en dominios distintos al que lanza el request, pero sinceramente, hoy en día se hace necesario el poder usar servicios web desde el lado del cliente a dominios diferentes. Para estoy hay varias técnicas, como Cors, XMLHttpRequest Level 2 y JSONP (JavaScript Object Notation with Padding), que básicamente es la llamada mediante JSON a dominios diferentes, en este articulo vamos a ver esta última técnica con un ejemplo sencillo(y por esta vez, sin mucha teoría), personalmente hace un tiempo tuve que implementarlo y fue bastante sencillo.

Utilicé jQuery para la llamada, que debe seguir ciertos patrones:

  • Tu llamada hazla con el verbo http GET
  • Setea crossDomain en true
  • Define la URI con el primer parametro como callback
  • Setea el DataType como “JSONP”

function LlamadaJSONP(param1, param2){

   $.ajax({
          type: "GET",
          crossDomain: true,
          contentType: "application/json; charset=utf-8",
      url: http://otrodominio/myws.asmx/NombreWebmethod?callback=?,
          data: {ID_Param1: param1,ID_Param2: param2 },
      dataType: ‘jsonp’,
          success: function(msg) { 
                    AjaxOK(msg);
                 },
                 error: AjaxError
            });

            function AjaxOK(result) {
                alert(result.d);
            } 
            function AjaxError(result) { 
                 alert("ERROR " + result.status + ‘ ‘ + result.statusText);
             }
}    
        
La variable callback nos sirve para que se devuelva el JSON como una llamada a una función. Esto nos permite el NO hacer una llamada Ajax real , si no incluir el archivo como script (y ahi si se permite las llamadas a otros dominios).

El Webmethod simplemente lo marqué con los siguientes atributos(no quise agregar el cuerpo del webmethod, ya que no influía para el ejemplo)

<ScriptMethod(UseHttpGet:=True,ResponseFormat:=ResponseFormat.JSON)

Puede que te encuentres con el siguiente error: Request format is unrecognized for URL unexpectedly ending in XXXXXX, para esto, lo solucionas agregando en el Web.config

<webServices>
      <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
      </protocols>
</webServices>

y listo!, funcionando sin problemas Sonrisa, problema del dominio cruzado solucionado.
Espero que te sirva
@chalalo!

Invitación a Evento- MSDN – Todos a bordo para el Futuro de HTML5 Mobile y Aplicaciones web híbridas para Windows Phone 8 y tabletas de Windows

Hola!,los quería invitar al siguiente evento :

Windows 8 y Windows Phone 8 frente a este desafío mediante la inclusión de Windows Internet Explorer 10 con aceleración por hardware de HTML y los gráficos, compilación JIT JavaScript, seguridad mejorada y un gran soporte para HTML 5. En esta sesión, se muestra Internet Explorer 10 capacidades proporcionadas por el Grupo de Trabajo de Aplicaciones Web W3C incluyendo IndexedDB y almacenamiento Web de datos sin conexión, enchufes Web para la comunicación bi-direccional, Web Workers para roscar y XmlHttpRequest para llamar a los servicios web. Tome sus páginas web sin conexión con caché de la aplicación y hacer que se reconoce la ubicación a través de la API de geolocalización. Te mostramos cómo hacerlo, así como la forma de construir aplicaciones web híbridas Sonrisa

Fecha: 29/08/2013
Hora: 04:00 PM (GMT-05:00 Colombia, Panama). Chile 3:00PM
Si tiene dudas con la conversión de zonas horarias, por favor haga clic aquí

URL de Registro para Asistentes
https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032559571&Culture=es-AR&community=0

Comenzando Azure Mobile Services–Ejemplo Práctico con HTML5 + JS [Parte 3]

Vamos a profundizar un poco más en el tema de los Script del servidor para el manejo de las acciones, en el post anterior, vimos como validar en la acción de insertar el tamaño de las entradas del nombre y del tipo.

Ahora vamos a realizar puede que no tenga mucho sentido, pero el tema es mostrar un escenario en donde necesitemos leer de un tabla un registro para insertarlo en otra antes de borrar.  Para esto voy a crear otra tabla que se llame “Papelero” , la idea es que antes de borrar un registro en la tabla Películas, leamos el registro, luego lo insertemos en la tabla “Papelero”, súper simple Sonrisa .Puedes ver en la siguiente imagen que tengo dos tablas, son idénticas entre sí.

image

Luego vamos a Datos y a la pestalla de Script y seleccionamos Eliminar:

image

El script es el siguiente:

function del(id, user, request) {
  var Peliculas = tables.getTable(‘Peliculas’);

    Peliculas
        .where({ id: id})
        .read({ success: CopiaRespaldo });

 

    function CopiaRespaldo(data) {
        if(data.length > 0) {
           var obj = {
                Nombre: data[0].Nombre,
                Votos: data[0].Votos,
                Tipo: data[0].Tipo
            };

             var Papelero = tables.getTable(‘Papelero’);
              Papelero.insert(obj, {
                success: insertComplete,
                error: errorHandler
            });
 

    } else {
            console.log(‘Error, Registro no encontrado’);
           
request.respond(statusCodes.NOT_FOUND, ‘Error, Registro no encontrado’);

       }

    }

   function insertComplete(){
      //Ahora borramos, cuando el insert esté ok
      request.execute();
  }

   function errorHandler(){
       //En Caso de error de inserción….
       console.log(‘Error, No se pudo insertar’);
       request.respond(statusCodes.ERROR, ‘Error, No se pudo insertar’);

  }

}

Puedes ver que lo primero que hacemos en hacer referencia hacia la tabla, luego leer de la tabla los registros que coincidan con la condición del Id, una vez que se se hace la llamada la función CopiaRespaldo, que revisa si existe un dato asociado para luego crear un objeto (obj) para ser insertado en la tabla Papelero,con los datos de la lectura de la tabla Películas. Puedes notar que se pasa como argumento una colección, por lo que, en mi caso, la lista devuelve un único elemento, lo accedo mediante su índice.  Para la inserción en la tabla Papelero, primero hacemos referencia a la tabla y realizamos la inserción, una vez que esta ok, hacemos el request.execute, que ejecuta la acción de borrado.

Por ejemplo, ingreso la película Superman y la quiero borrar:

image

Presiono borrar y luego verás el registro almacenado en la tabla Papelero:

image

Bastante sencillo, puedes ver más información de los Script Para Azure Mobile Services en la documentación:
http://msdn.microsoft.com/en-us/library/windowsazure/jj554226.aspx

Luego vemos el tema de los permisos Sonrisa
Saludos,
@chalalo