Este artículo proviene de un motor de traducción automática.
Sitios web Azure
Construcción de un servicio web Node.js y MongoDB
Descargar el código de muestra
La nube es neutral a todos los idiomas. En la nube, no importa si las aplicaciones corres son Node.js, ASP.NET, Java o PHP, porque la nube proporciona una infraestructura confeccionada para ejecutarlos. La religión de la nube es la agilidad y agilidad le permite implementar rápidamente nuevas ideas y puesta del sol los que no trabajan en el mercado. En los últimos años, Node.js ha ganado popularidad entre una nueva clase de desarrolladores que favorecen el paradigma de programación asincrónico. Node.js es un motor de tiempo de ejecución de JavaScript para crear aplicaciones cliente y servidor. Incluye un marco de I/O asíncrono que ayuda a manejar miles de conexiones simultáneas en un único subproceso con CPU mínima o sobrecarga de memoria. Es un mito popular que Node.js es un framework de desarrollo Web; de hecho, es un motor de ejecución de subprocesos para ejecutar código JavaScript. Tiene una arquitectura basada en el módulo que permite crear y publicar un módulo para manejar tareas específicas, tales como desarrollo Web o acceder a una base de datos MongoDB. Por ejemplo, el motor de plantilla Express es un framework para aplicaciones Web que puede descargar como un módulo en Node.js. El motor de Node.js central está construido en C++ sobre el motor JavaScript V8 de Google, que fue diseñado para el navegador Chrome. Node.js es apoyada en los sitios Web de Microsoft Azure, y Microsoft también proporciona herramientas de desarrollo y un SDK nativo para la programación con las APIs de Azure. Hay un centro de desarrolladores dedicado para Node.js en el Portal de Azure en bit.ly/1iupElQ.
En este artículo, te voy a mostrar cómo desarrollar un servicio Web RESTful en Node.js que tiene acceso a una base de datos MongoDB en la nube y cómo implementarlo a sitios Web de Azure.
Node.js se basa en un modelo de desarrollo asincrónico, que significa que cada llamada al método requiere una devolución de llamada para recibir la respuesta. Aunque los desarrolladores .NET tradicionalmente prefieren llamadas al método sincrónico (solicitud-respuesta), siempre han existido las capacidades asincrónicas en Microsoft .NET Framework. Con la inclusión de la nueva async-esperan el modelo de programación en .NET Framework, aplicaciones asincronas se han convertido en la norma a través de aplicaciones Web y móviles. En la programación asincrónica, llamando a la función se suscribe al evento de devolución de llamada y proporciona un delegado para procesar la respuesta. La función de devolución de llamada se llama cuando el proceso termine. Es como un correo electrónico comparado con una llamada telefónica.
A continuación muestra un simple servidor Node.js Web devuelve una cadena cuando llame:
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type":
"text/plain"});
response.write("Hello MSDN");
response.end();
}).listen(8080);
Tenga en cuenta que la función de respuesta se llama cuando se dispara un evento de solicitud HTTP. Se utiliza la función requiere para cargar módulos, similares a la carga de los espacios de nombres de ensamblados en .NET Framework.
Ha habido muchas discusiones y argumentos religiosos en ASP.NET versus Node.js, pero no voy a tocar ese tema en este artículo. Mi enfoque ha sido siempre utilizar la mejor herramienta para el trabajo, y con lo que eres bueno en hacer lo mejor.
Procesamiento de la solicitud de node.js
Como figura 1 muestra, el motor Node.js inicia un subproceso único para el manejo de las conexiones de cliente simultáneas. Como ya está inicializado el hilo único, no hay no arriba requerido para procesar cualquier aumento en las solicitudes porque el hilo rápidamente delega la solicitud asincrónica en un subproceso de trabajo para el proceso de inicialización.
Figura 1 Node.js solicitud-respuesta orquestación
Si solicita el HTTP incluye una tarea de larga duración o intensivas O, como base de datos access o una llamada al servicio Web, se ejecuta asincrónicamente en subprocesos sin bloqueos. Una vez completada la tarea de larga duración, los subprocesos de trabajo devuelven los resultados como una devolución de llamada para el subproceso principal. El subproceso principal entonces devuelve el resultado al cliente. Una imporconcepto tant de entender aquí es que el único hilo receptora está siempre disponible para recibir peticiones y no siguen ocupado con procesamiento porque el proceso se delega en los subprocesos de trabajo.
Componentes básicos de node.js
Node.js consta de dos componentes principales:
Núcleo/Kernel: El núcleo de Node.js está escrito en C++ en la parte superior del motor JavaScript V8 de Google. El núcleo mismo es subprocesos y es capaz de cargar equilibrio entre CPUs. Node.js es open source y usted puede conseguir el código fuente de github.com/joyent/node.
Módulos: Los módulos son similares a los paquetes de NuGet de .NET Framework. El Node.js Administrador de paquetes (NPM) es la herramienta para la gestión de paquetes Node.js en el entorno de desarrollo. Módulos de engendrar nuevos procesos o subprocesos dependiendo de la intensidad de I/O de la tarea. Entre los módulos populares son HTTP, MongoDB, Express (un marco de plantilla Web) y Socket.IO. Para una lista de módulos de populares, por favor visite nodejsmodules.org.
Instalar y ejecutar localmente Node.js
Antes de ejecutar cualquier sitio Node.js Web en la nube, te recomiendo probando localmente para sentirse cómodo con la plataforma. Puede instalar y ejecutar Node.js en una plataforma Windows en sólo tres pasos:
- Descargue e instale Node.js: Node.js Windows installer puede ser descargado e instalado desde nodejs.org/#download. El instalador instala el runtime Node.js y MNP.
- Crear un servidor simple: Para crear un servidor HTTP en Node.js, abra su editor de texto favorito, copie el código de figura 1y guarde el archivo como webserver.js. El código mostrado anteriormente crea un servidor Web minimalista que escucha en el puerto 8080 y responde con la misma cadena para cada solicitud.
- Ejecute el servidor HTTP: Finalmente, para ejecutar el servidor, abra símbolo del sistema, vaya a la carpeta donde guardaste el archivo webserver.js y escriba lo siguiente:
> "C:\Program Files\nodejs\node.exe" webserver.js - Este comando inicia el servidor Web, y usted lo puede probar navegando su navegador a http://localhost: 8080. Este servidor simple le dará confianza suficiente para probar Node.js como una opción para el desarrollo de sitios Web.
Ejecuta Node.js en sitios Web de azul
Cuando primero utilicé Node.js, he decidido evitar la línea de comandos tanto como sea posible. Haber vivido mi vida en Visual Studio, valoro mucho la productividad que se puede lograr usando un IDE. Afortunadamente, Microsoft ha invertido en WebMatrix, una poderosa herramienta para develconservarla Node.js aplicaciones en Windows. El equipo de Visual Studio también ha publicado las herramientas Node.js para Visual Studio (nodejstools.codeplex.com). Para el resto de este artículo, utilizare WebMatrix como mi herramienta de desarrollo primario. Desde WebMatrix, usted puede instalar paquetes de NPM, publicar sitios Web de Azure y también ejecutarlos localmente. WebMatrix también instala IISNode para IIS Express, que permite hospedar la aplicación Node.js en IIS. Puede obtener más detalles sobre IISNode en github.com/tjanczuk/iisnode.
Antes de crear un servicio Web RESTful completo, te voy a mostrar cómo publicar un sitio Web simple en Azure desde WebMatrix.
Crear un nuevo sitio Web de Azure puede crear un nuevo sitio Web en Azure desde el Portal de Azure, como se ilustra en figura 2.
Figura 2 crear un nuevo sitio Web azul
El Portal creará un nuevo sitio con un nombre único en la región que especifique. La región es importante para localizar conjuntamente con su sitio Web, bases de datos y otros servicios en el mismo centro de datos. Datos que sale de un centro de datos está cargadas.
Crear un sitio Web Express Express es un framework para aplicaciones Web para Node.js. Sigue el patrón Model-View-Controller (MVC) y, por tanto, permite establecer rutas para construir sitios Web MVC Node.js, así como los servicios Web RESTful. Puede descargar Express de expressjs.com.
Si te gusta desarrollo .NET en Visual Studio, te recomiendo masterización WebMatrix para desarrollar aplicaciones Node.js. WebMatrix 3 incluye una plantilla Express precompilada, útil. Abrir y haga clic en Nueva | Galería de plantillas. A continuación, bajo la categoría Node.js, seleccione la plantilla de sitio Express, como se muestra en figura 3.
Especifique un nombre de sitio y haga clic en siguiente para instalar la plantilla de sitio Express y IISNode.
Plantilla de sitio expresa figura 3
El servidor de Node.js que construí antes no funciona como es en los sitios Web en Azure porque la infraestructura de sitios Web de Azure depende de IIS para el funcionamiento de los sitios Web. Por lo tanto, para ejecutar un sitio Node.js Web, necesito la integración entre IIS y Node.js que proporciona IISNode.
Figura 4 ilustra la estructura de archivos creada por la plantilla Express y el código fuente de server.js.
Figura 4 estructura de archivo expreso
Tenga en cuenta que el expreso y rutas módulos conseguir importados automáticamente. Usaré estos módulos para construir los servicios REST.
Funcionamiento del sitio Web local siguiendo mi recomendación anterior, haga clic en el botón ejecutar en WebMatrix para probar el sitio Web en su máquina local. Si la instalación fue exitosa, debería ver la Página Web de Express.
Plantilla expresa también instala el motor de plantilla Jade. Jade es un motor de plantilla HTML y se utiliza para construir las opiniones generadas desde el marco Express. Jade es para expresar lo que es Razor ASP.NET MVC. Por lo tanto, el contenido de index.html se procesa de /views/index.jade y /routes/index.js. Estas rutas se instalan en las líneas 16, 17 y 30 de server.js, como se muestra en la figura 4. Para obtener más información sobre el motor de plantilla Jade, visite jade-lang.com.
Publicar el sitio Web de Azure ahora que has construido un sitio Node.js Web en Express localmente, a publicarlo en Azure. Haga clic en el botón publicar en WebMatrix para iniciar el proceso. Importar el perfil de publicar su sitio Web y siga el Asistente para la publicación como se muestra en la figura 5.
Figura 5 publicar en Microsoft Azure
Si todo va bien, WebMatrix cargará su sitio Web en Internet Explorer.
La dirección URL en el navegador debe ser el sitio Web de Azure que publicaste el sitio Web. Esta es una buena demostración de lo fácil que es desarrollar e implementar servicios Web y sitios Node.js Web a Azure. Ahora, voy a tomar un momento para mirar MongoDB. Regresaré a Node.js más adelante para construir servicios Web.
Resumen de MongoDB
MongoDB es una fuente abierta, escalable, alto rendimiento, orientada al documento de base de datos que incluye la mayoría de las capacidades de la infraestructura de bases de datos relacionales, como la replicación, sharding, indexación y failover. MongoDB también ofrece auto-sharding e incorporado mapa-reducir las capacidades, que no son ofrecidas por la mayoría de bases de datos relacionales hoy de procesamiento. Bases de datos relacionales fueron diseñados en una época donde eran costosos sistemas de almacenamiento. Almacenar datos en un formato relacional permitido a los desarrolladores optimizar el espacio de almacenamiento sin comprometer la recuperación de datos rápida. En el mundo de hoy, es barato en comparación para calcular los costos de almacenamiento. En la nube, los precios de almacenamiento continúan disminuyendo. Como resultado, ahorro y recuperación de datos en formato relacional es caro en comparación con el almacenamiento en la nube. La demanda para la entrega continua de datos está en aumento, con más aplicaciones esperando datos en tiempo real de su almacenamiento de datos. MongoDB permite guardar objetos y documentos sin romperlos en componentes relacionales. Esto reduce la carga de procesamiento en la aplicación, así como la base de datos.
MongoDB no se recomienda para aplicaciones que requieren relaciones de objeto profundo porque no está diseñada para mantener y recuperar el objeto y la vinculación de relación de datos, como bases de datos relacionales. Si la aplicación requiere relaciones profundas y SQL para la recuperación, utiliza una base de datos relacional. Si la aplicación requiere recuperación y almacenamiento rápido objeto, utilice MongoDB. Como he sugerido antes, utilice la mejor herramienta para el trabajo.
Aprovisionamiento MongoDB en Azure
MongoDB está disponible como complemento en la tienda azul y se puede instalar una versión sandbox gratis. Inicie sesión en el Portal de Azure e instalar MongoDB (MongoLab) de la nueva | Tienda | Menú Add-on, como se muestra en la figura 6.
Figura 6 MongoDB Add-on de MongoLab
En la página de Add-on personalizar, seleccione la versión Sandbox y asegúrese de instalar la instancia MongoDB en la misma región que tu sitio Web, como se muestra en la figura 7.
Figura 7 configuración MongoDB
Una vez completada la instalación, vaya a la página de Add-on y guardar la cadena de conexión para la base de datos instalada, como se muestra en figura 8. Usará la cadena de conexión para conectar desde el servicio Node.js Web.
Figura 8 cadena de conexión para la base instalada
MongoDB ahora está funcionando en Azure. MongoLab (por ObjectLabs Corp.) tiene su propio Portal de gestión dedicado puede ver haciendo clic en el vínculo gestionar su complemento.
Ahora tiene una base de datos MongoDB corriendo en la nube, y ha creado una plantilla de Node.js vacío. Para completar la solicitud, debes rellenar la base de datos MongoDB y crear los servicios Web que recuperan datos de esta base de datos. Este es el desarrollo de software estándar en la nube.
Instalación de prerrequisitos Node.js para conectividad de MongoDB
JSON es un ciudadano de primera clase en MongoDB y, por tanto, complementa Node.js. Porque el servicio Web se conectará con MongoDB, necesito instalar el controlador más reciente de Node.js para MongoDB desde la galería de MNP (ver figura 9).
Figura 9 Node.js Driver for MongoDB
La información de conexión MongoDB se almacena en un archivo de configuración. El módulo nconf permite leer información de configuración de archivos (ver figura 10).
Figura 10 el módulo nconf
Una vez instalados los módulos de mongodb y nconf, has completado todos los requisitos para la creación de un entorno de desarrollo Node.js y MongoDB.
Creación de las firmas de servicio Web de resto
Para crear un servicio Web de resto, primero define dependencias y rutas en server.js:
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path'),
pkgs=require('./routes/pkgs');
A continuación, define las funciones del resto en el archivo /routes/pkgs.js porque, en el código anterior, se delega la función de manipulación al módulo pkgs. En la carpeta de las rutas, cree un archivo denominado pkgs.js que define las operaciones de servicio Web, como se muestra en la figura 11.
Figura 11 resto operación firmas
exports.findAll = function(req, res) {
res.send([{name:'app1'}, {name:'app2'}, {name:'app3'}]);
};
exports.findById = function(req, res) {
res.send({id:req.params.id,
name: "DisplayName", description: "description"});
};
exports.addPkg = function (req, res) {
res.send("Success");
};
exports.updatePkg = function (req, res) {
res.send("Success");
};
Para probar el funcionamiento básico de las operaciones, crear esqueletos función devolver datos estáticos. Usted puede agregar el código de acceso de base de datos más adelante. En server.js, definir los métodos de ruta que corresponden a los métodos de módulo que acaba de crear:
app.get('/pkgs', pkgs.findAll);
app.get('/pkgs/:id', pkgs.findById);
app.post('/pkgs', pkgs.addPkg);
app.put('/pkgs/:id', pkgs.updatePkg);
Si estás familiarizado con la API de Web ASP.NET , entenderás rápidamente estas rutas y su asignación a la clase de implementación apropiada. Con la declaración de ruta y mapeo, cualquier petición de /pkgs se enrutarán a una de las funciones de pkgs.js. Con las firmas de operación de servicio Web y definiciones en su lugar, puede probar si las rutas están trabajando correctamente ejecutando el sitio Web localmente, así como en azul. El URL para probar son: URL del sitio http://[Web] / pkgs, http://[Web sitio URL] / pkgs/remote y http://[Web sitio Url] / pkgs/1. Si estas URL devuelven los valores esperados, las rutas están trabajando bien y puede continuar con la integración de MongoDB.
Implementación de operaciones del servicio Web resto
Ahora tienes que implementar las operaciones de servicio Web para conectar a MongoDB y recuperar los datos. Cuatro pasos logrará esto:
- Crear un archivo config.json y almacenar la cadena de conexión MongoDB en él.
- Inicializando al cliente MongoDB.
- Poblando MongoDB con datos de la muestra. En este paso, la función hace un HTTP GET llamar a http://storage.appsforazure.com/appsforazureobjectstest/servicepackages.json y almacena los datos recuperados en la instancia de MongoDB.
- Implementación de las funciones de acceso a datos para recuperar y almacenar datos en MongoDB.
Crear el archivo config.json el archivo config.json, que es similar a un archivo app.config .NET pero en formato JSON, almacena su información de configuración. Agregue el siguiente par nombre / valor para el nuevo archivo:
{
"MONGOLAB_URI" :
"mongodb://nodeapps:xxxxxxxx.f.migd9GGB9Ck3M17jlkVCUVI-@ds027758.
mongolab.com:27758/nodeapps"
}
El valor es la cadena de conexión MongoDB que salvaste anteriormente desde el Portal de Azure.
En pkgs.js, usted tiene que importar el módulo nconf para leer los valores de configuración:
var nconf = require('nconf');
nconf.env().file({ file: 'config.json' });
var connectionString = nconf.get("MONGOLAB_URI");
La variable connectionString puede utilizarse luego por las funciones para conectarse a la base de datos MongoDB. Tenga en cuenta que ese connectionString es declarado como una variable global en pkgs.js para que todas las funciones se pueden acceder al mismo.
Inicializando al cliente MongoDB: Para inicializar una conexión a la base de datos MongoDB, tienes que importar el módulo mongodb y llame al método de conexión, como se muestra en la figura 12.
Figura 12 Conecte a la base de datos MongoDB
var mongo = require('mongodb');
var MongoClient = mongo.MongoClient
MongoClient.connect(connectionString, function (err, db) {
if (err) throw err;
if (!err) {
console.log("Connected to 'pkgsdb' database");
db.collection('pkgs', { strict: true },
function (err, collection) {
if (err) {
console.log(
"The 'pkgsdb' collection doesn't exist.
Creating it with sample data...");
populateDB(db);
}
});
}
})
Cuando la conexión es exitosa, la variable db figura 12 contiene el objeto de conexión de base de datos. La función db.collection intenta conectarse a una colección llamada paquetes Si pkgs no existe, se crea una nueva llamando la función populateDB. En una aplicación del mundo real, no necesitarías hacer esto porque en realidad se crearía la colección antes de ejecutar la aplicación. (Una colección de MongoDB es una agrupación de documentos relacionados, análogos a una tabla de base de datos en un sistema de base de datos relacional).
Poblando MongoDB con datos de ejemplo para este artículo, he utilizado datos de muestra disponibles como una colección de paquetes de software de dynamicdeploy.com. En la función populateDB, cargué esta colección en formato JSON de http://storage.appsforazure.com/appsforazureobjectstest/servicepackages.json, como se muestra en la figura 13.
Figura 13 rellenar la base de datos
var populateDB = function (db) {
var body = "";
var url =
"http://storage.appsforazure.com/appsforazureobjectstest/servicepackages.json";
http.get(url, function (res2) {
res2.on('data', function (chunk) {
body += chunk;
});
res2.on("end", function () {
var pkgs = JSON.parse(body)
db.collection('pkgs', function (err, collection) {
collection.insert(pkgs, { safe: true },
function (err, result) { });
});
});
res2.on("error", function (error) {
// You can log here further
})
});
Tenga en cuenta que JSON es un ciudadano de primera clase en Node.js, así no tienes que importar cualquier módulo para analizar los objetos JSON. La función collection.insert inserta el documento JSON (var pkgs) en la colección de MongoDB. MongoDB determina el esquema de los objetos en tiempo de ejecución y toma decisiones inteligentes acerca de almacenarlos. En una base de datos relacional, tendrías que definir el esquema de la tabla antes de guardar los datos en él. Una colección le da la flexibilidad para modificar el esquema en tiempo de ejecución sólo cambiando las propiedades de los objetos JSON. Si cambian las propiedades del objeto, MongoDB aplica automáticamente los cambios en el esquema antes de guardar el objeto. Esto es útil para la construcción de aplicaciones, como el social y el Internet de las cosas alimentaciones, que cambian dinámicamente con los cambios en los tipos de datos.
Implementación de las funciones de acceso a datos finalmente, usted necesita implementar las funciones de acceso de datos para el HTTP GET, POST y PUT funciones declararon anteriormente. La función HTTP GET se asigna a las funciones findById y findAll en el servicio Web, como se muestra en la figura 14.
Figura 14 las funciones de búsqueda
exports.findById = function (req, res) {
var id = req.params.id;
console.log('Retrieving pkg: ' + id);
MongoClient.connect(connectionString, function (err, db) {
if (err) throw err;
if (!err) {
db.collection('pkgs', function (err, collection) {
collection.findOne({ '_id': new BSON.ObjectID(id) },
function (err, item) {
res.send(item);
});
});
}
})
};
exports.findAll = function(req, res) {
MongoClient.connect(connectionString, function(err, db) {
if(err) throw err;
if(!err) {
db.collection('pkgs', function(err, collection) {
collection.find().toArray(function(err, items) {
res.send(items);
});
});
}
})
};
La función findById recupera un objeto por su identificación, mientras que la función findAll recupera todos los objetos. Funciones de collection.finduno y collection.find recuperar los resultados de estas operaciones de MongoDB, respectivamente. Asimismo, figura 15 muestra el método addPkg, que está asignado a un POST de HTTP y el método updatePkg, que se asigna a un HTTP PUT.
Figura 15 agregar y actualizar las funciones
exports.addPkg = function (req, res) {
var pkg = req.body;
console.log('Adding pkgs: ' + JSON.stringify(pkg));
MongoClient.connect(connectionString, function (err, db) {
if (err) throw err;
if (!err) {
db.collection('pkgs', function (err, collection) {
collection.insert(pkg, { safe: true }, function (err, result) {
if (err) {
res.send({ 'error': 'An error has occurred' });
} else {
console.log('Success: ' + JSON.stringify(result[0]));
res.send(result[0]);
}
});
});
}
})
};
exports.updatePkg = function (req, res) {
var id = req.params.id;
var pkg = req.body;
console.log('Updating pkgs: ' + id);
console.log(JSON.stringify(pkg));
MongoClient.connect(connectionString, function (err, db) {
if (err) throw err;
if (!err) {
db.collection('pkgs', function (err, collection) {
collection.update({ '_id': new BSON.ObjectID(id) },
pkg, { safe: true }, function (err, result) {
if (err) {
console.log('Error updating pkg: ' + err);
res.send({ 'error': 'An error has occurred' });
} else {
console.log('' + result + ' document(s) updated');
res.send(pkg);
}
});
});
}
})
};
Si usted ha seguido hasta ahora el artículo, debe ser capaz de implementar una función eliminar por su cuenta. Voy a dejar como un ejercicio para usted. Guardar y ejecutar el sitio Web local primero y luego publicarlo a sitios Web de Azure para probar cada función del resto. El código fuente completo para el servicio Web de descanso y el sitio Web está disponible en github.com/dynamicdeploy/appsforazure.
Una vez que tienes la aplicación end-to-end que se ejecuta, puede escalar su infraestructura MongoDB (o servicio) dependiendo de la carga del usuario. Como demuestra este artículo, no necesitas ninguna infraestructura para implementar sitios MongoDB Web y Node.js a gran escala en Azure. El esqueleto que proporcionado en el código fuente de acompañamiento le ayudará a empezar a construir servicios Web y sitios Web en Node.js en sitios Web de Azure.
Resumen
El propósito de este artículo era para cómodo crear servicios Web en Node.js en sitios Web de Azure. Node.js y MongoDB complementan entre sí y porque ambos están disponibles como plataforma como servicio (PaaS), no hay ninguna infraestructura inicial costo para construir un sitio Web completo y lo escalado dinámicamente. Como desarrollador, puedes concentrarte en la construcción y consumo de los servicios Web desde la nube en sus aplicaciones móviles. Por lo tanto, yo creo sitios Web Azure PaaS bien hecho.
Tejaswi Redkar es un autor y Desarrollador de software. Actualmente trabaja como director de estrategia de plataforma de aplicaciones y comunidades para Microsoft. Su libro, "Windows Azure Web Sites: La construcción de aplicaciones Web a un ritmo acelerado"(Dynamic desplegar LLC, 2013), es la más amplia y más vendida en el tema. Redkar es también el creador de Windows App Store appsforazure y dynamicdeploy.com, donde él experimenta de primera mano corriente producción aplicaciones en la nube. Usted puede llegar a él en tejaswi_redkar@hotmail.com y seguirlo en Twitter en twitter.com/tejaswiredkar.
Gracias a los siguientes expertos técnicos por revisar este artículo: Equipo de gestión de producto de Microsoft Azure