Construire une application marketing Facebook sur la plateforme Windows Azure

Documents pareils
SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Introduction au développement SharePoint. Version 1.0

OpenPaaS Le réseau social d'entreprise

Alfstore workflow framework Spécification technique

SQL Server Installation Center et SQL Server Management Studio

3 Octobre Les Communautés MS

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Créer un rapport pour Reporting Services

EXTENSION de Microsoft Dynamics CRM Réf FR 80452

Encryptions, compression et partitionnement des données

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Développement d'une application Web avec ASP.NET MVC

Guide de démarrage Tradedoubler. Manuel éditeur / affilié

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

BIRT (Business Intelligence and Reporting Tools)

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

SPT Description du cours NORAMSOFT SPT2013. SharePoint 2013 pour développeurs

INTRODUCTION À LA GESTION DE PROJET AGILE (BACKLOG, TABLEAUX DE BORD, BURNDOWN, PLANIFICATION D ITERATIONS)

Introduction MOSS 2007

Reporting Services - Administration

La double authentification dans SharePoint 2007

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

TP3-2 CONSTRUISEZ VOTRE PREMIER SERVICE AZURE

TP JAVASCRIPT OMI4 TP5 SRC

Qu est ce que Visual Guard. Authentification Vérifier l identité d un utilisateur

et Active Directory Ajout, modification et suppression de comptes, extraction d adresses pour les listes de diffusion

Comment créer des rapports de test professionnels sous LabVIEW? NIDays 2002

Une introduction à la technologie EJB (2/3)

Déploiement d'une base SQL Express

La base de données XML exist. A. Belaïd

Le hub d entreprise est une application de déploiement des applications mais aussi un outil de communication

Dossier Technique. Détail des modifications apportées à GRR. Détail des modifications apportées à GRR Le 17/07/2008. Page 1/10

INTRODUCTION AUX TESTS DE PERFORMANCE ET DE CHARGE

Flex. Lire les données de manière contrôlée. Programmation Flex 4 Aurélien VANNIEUWENHUYZE

Installation de SCCM 2012 (v2)

Le langage C. Séance n 4

Tropimed Guide d'installation

SUPPORT DE COURS / PHP PARTIE 3

Accès aux bases de données

Nouveautés CRM 2015 & Migration. By Tanguy Touzard MVP CRM

Whitepaper. Méthodologie de création de rapports personnalisés SQL Server Reporting Services

1. Base de données SQLite

Attaques applicatives

Installation de SQL Server Reporting Services avec l intégration dans un site Windows SharePoint Services V3

Microsoft Application Center Test

Construire des plug-ins pour SAS Management Console SAS 9.1

Gestion de base de données

Exploration des technologies web pour créer une interaction entre Mahara et les plateformes professionnelles et sociales

Description des pratiques à adopter pour la mise à jour du layout en utilisant le gestionnaire de conception de Sharepoint 2013

1. Installation du Module

Plateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.

Présentation Windows Azure Hadoop Big Data - BI

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Logiciel : GLPI Version : SYNCRHONISATION DE GLPI AVEC ACTIVE DIRECTORY. Auteur : Claude SANTERO Config. : Windows 2003.

VXPERT SYSTEMES. CITRIX NETSCALER 10.1 et SMS PASSCODE 6.2. Guide d installation et de configuration pour Xenapp 6.5 avec SMS PASSCODE 6.

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

CAHIER DES CHARGES SITE WEB : Steve Mind Magicien Close-up & Mentaliste - 1 -

Procédure pas à pas de découverte de l offre. Service Cloud Cloudwatt

ADMINISTRATION DE ADOBE LIVECYCLE MOSAIC 9.5

Mise en œuvre des serveurs d application

COMMENT TROUVER VOS FUTURS CLIENTS À L INTERNATIONAL? 05/03/2015 Creditsafe France

API HTTP DOCUMENTATION TECHNIQUE PLATEFORME SAAS D'ENVOI DE SMS. Version Mise à jour : 3 juillet 2015

Point sur les solutions de développement d apps pour les périphériques mobiles

Introduction à ElasticSearch

Création d un service web avec NetBeans 5.5 et SJAS 9

Business Intelligence simple et efficace

Architecture Orientée Service, JSON et API REST

SYSTÈMES D INFORMATIONS

Quel serveur pour vous?

Paginer les données côté serveur, mettre en cache côté client

Micro-ordinateurs, informations, idées, trucs et astuces utiliser le Bureau à distance

Keyyo Guide de mise en service CTI / API / TAPI Keyyo

TD/TP 1 Introduction au SDK d Android

vcenter Server 1. Interface Lancez le vsphere Client et connectez vous à vcenter Server. Voici la page d accueil de vcenter Server.

Manuel d utilisation JeResilieMonContrat.com. pour l agent

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Rafraichissement conditionné d'une page en.net

Connecter les formulaire d identification Qualifio à votre système d enregistrement (SSO) Mars 2012

Le cloud conçu pour votre organisation.

Bases de données relationnelles

Les BASES de DONNEES dans WampServer

Solutions de gestion de la sécurité Livre blanc

MON 1ER JEU-CONCOURS SUR FACEBOOK

WINDOWS AZURE ET LES ÉDITEURS DE LOGICIELS

Application Form/ Formulaire de demande

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

PROJET AZURE (par Florent Picard, A2011)

Sécurisation d une application ASP.NET

Sauvegarde des bases SQL Express

LIVRE BLANC. Migration de Magento Community Edition MD à Magento Enterprise Edition MD

Sage 100 CRM Guide de l Import Plus avec Talend Version 8. Mise à jour : 2015 version 8

Guide d'installation. Release Management pour Visual Studio 2013

Le Ro le Hyper V Troisie me Partie Haute disponibilite des machines virtuelles

Transcription:

Construire une application marketing Facebook sur la plateforme Windows Azure

Lorsque le «Social Effect» est au rendez-vous, comment s assurer que votre application va supporter la montée en charge? Nous allons vous montrer comment créer une simple application marketing pour Facebook sur la plateforme Windows Azure, en utilisant le Windows Azure Toolkit et le SDK C# Facebook, va vous rendre la vie plus facile. Une campagne marketing sur Facebook est conçue pour attirer les clients sur votre business et fonctionne souvent de la même manière : sur la page Facebook de votre entreprise, vous offrez aux clients une récompense en échange de leurs données. En général, la campagne est limitée dans le temps car vous avez une quantité limitée de récompenses à offrir. Mais si la campagne décolle, vous devrez être prêt à faire face tant d un point de vue du budget marketing que de l infrastructure! Windows Azure est la plateforme idéale pour construire une application avec ce type de montée en charge. Vous pouvez débuter avec seulement quelques instances et un stockage limité et ajouter de la capacité information en fonction des besoins de votre application. Cependant, faire tourner l application sur Windows Azure ne suffit pas à profiter de tous les avantages de la plateforme. Une application Windows Azure doit aussi être pensée pour croitre correctement, en utilisant différentes bonnes pratiques tels que l usage des différents rôles ou encore des structures de stockage simples et évolutives. Nous allons donc vous montrer comment construire une application marketing Facebook sur Windows Azure capable de résister à tous les pics d activité. Cette application s inspire de l énorme succès de la campagne Facebook Bloomin Onion mis en place pour Outback Steakhouse en 2009 par l agence Thuzi. Elle est également bâtie sur deux outils : Windows Azure Toolkit et le SDK C# de Facebook. 2

Principe de l application Nous allons bâtir l application comme un canevas d application Facebook. La première fois que l utilisateur exécutera l application («AzureSample»), il verra apparaître une demande de permission afin que l application accède aux informations telles que la date d anniversaire du contact depuis Facebook. Figure 1. L application aura besoin d accéder à la date d anniversaire du contact. Facebook présente cette demande sous forme d écran avant de démarrer l application. L application déclare quelles autorisations sont nécessaires via un attribut fourni par le SDK C# de Facebook. En supposant que le client accepte la demande d autorisation, nous exécuterons ensuite «AzureSample» et commencerons à rassembler des informations sur les clients. Figure 2. La première page de l URL canevas de l application collecte les informations sur le contact. Quand la page est ouverte, le nom, prénom et la date de naissance sont pré-remplis avec les informations récoltées sur Facebook. 3

Les noms, prénoms et dates de naissance des clients sont lus depuis Facebook et utilisés pour préremplir les champs sur la page. Le client doit renseigner son adresse mail et son code postal pour pouvoir accéder à la page suivante. Figure 3. La page de sélection de magasins. Une liste de trois magasins se présente au client à moins de 80 km du code postal qu il aura fourni précédemment. La page suivante présente une liste trois magasins à proximité. Ce sont les trois magasins les plus proches dans un rayon de 80 km autour du code postal fourni. A ce stade, nous avons rassemblé toutes les informations nécessaires sur le contact. «AzureSample» démarre une tâche de fond pour envoyer un email avec la récompense accordée au client et pour migrer les informations de contact depuis un service de stockage Tables Windows Azure vers SQL Azure. A ce stade, il ne reste qu à créer la page finale. Figure 4. La Page remerciement. Le contact est redirigé ici s il exécute l application après s être inscrit. 4

Structure du projet Sur Facebook, l application est connue sous le nom «AzureSample» car les applications sur Facebook ne peuvent pas inclure le terme Facebook. Si vous deviez installer l application, vous devrez probablement lui donner un nom plus significatif sur Facebook comme par exemple «SignUpFreeX». Dans Visual Studio, l application est appelée «AzureFacebookSample», et comprend quatre projets. Figure 5. «AzureFacebookSample» dans Visual Studio, mettant en avant les quatre projets. «AzureFacebookSample.Cloud» est le principal projet de l application Azure. Il inclut deux rôles, le web rôle et un simple worker rôle. Le web rôle est mis en œuvre par le projet «AzureFacebookSample.Web» et le worker rôle, sans surprise, est mis en œuvre par le projet «AzureFacebookSample.Worker». Le web rôle est un projet ASP.NET MVC et comprend des vues de tous les écrans de l application. Le worker rôle se charge d envoyer l email avec la récompense et de migrer les informations d informations depuis le service de stockage Tables de Windows Azure vers SQL Azure. «AzureFacebookSample.Domain» est un projet de bibliothèque de classement incluant des modèles de données, des files d attente et des référentiels de données partagés par les web et worker rôles. «AzureFacebookSample» démontre comment vous pouvez structurer une application Facebook sur Azure, mais ne fait pas certaines choses que vous devez faire vous-même pour mettre en œuvre une application de marketing viral de votre choix. Premièrement, les worker rôle n envoient pas réellement l email. Dans une application réelle, le worker rôle aurait besoin de contacter un service externe qui serait capable de générer la quantité d emails requise par la campagne marketing. Deuxièmement, Vous aurez besoin d un worker rôle additionnel pour gérer les emails de retour et pour contacter les clients sur Facebook pour tenter d obtenir les adresses correctes. Le premier canevas de la page Le canevas de la page de l application sur Facebook créé sur Azure un URL de base pour l application (par exemple http://azurefacebooksample.cloudapp.net/). Ce sera la page qui affichera le formulaire de contact initial. Voici la mise en œuvre de base : 5

Listing 1 [CanvasAuthorize(Perms = "user_birthday")] public ActionResult Index() FacebookApp app = new FacebookApp(); dynamic response = app.api("me"); Contact contact = new Contact(); contact.firstname = response.first_name; contact.lastname = response.last_name; string query = "select birthday_date from user where uid = me()"; response = app.fql(query); if (response.count > 0) contact.dateofbirth = response[0].birthday_date; return View(contact); Cela semble assez simple, principalement grâce au SDK C# Facebook. Le SDK gère les autorisations et les authentifications «Facebook OAuth» pour l application au travers de l attribut «CanvasAuthorize» et fournit l objet «FacebookApp». Vous retiendrez qu avant qu un nouvel utilisateur puisse exécuter «AzureSample» il devra autoriser l application à accéder à sa date d anniversaire. Ainsi, tout ce que nous devons faire, c est de marquer des actions de contrôle qui requièrent une autorisation avec l attribut «CanvasAuthorize», en spécifiant éventuellement les droits étendus à la demande (comme nous l avons fait ici avec «user_birthday»). L objet «FacebookApp» permet d accéder à la demande d information dans la requête signée et accède aux graphiques Facebook et REST APIs. Voici le code complet de la vue index : Listing 2 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<AzureFacebookSample.Domain.Models.Contact>" %> <asp:content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> Home </asp:content> <asp:content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <div>please provide the following information. All fields are required. <% using (Html.BeginForm()) %> <%: Html.ValidationSummary(true)%> <div class="editor-label"> <%: Html.LabelFor(model => model.firstname)%> <div class="editor-field"> <%: Html.TextBoxFor(model => model.firstname)%> <%: Html.ValidationMessageFor(model => model.firstname)%> <div class="editor-label"> <%: Html.LabelFor(model => model.lastname)%> <div class="editor-field"> <%: Html.TextBoxFor(model => model.lastname)%> <%: Html.ValidationMessageFor(model => model.lastname)%> <div class="editor-label"> <%: Html.LabelFor(model => model.email)%> 6

<div class="editor-field"> <%: Html.TextBoxFor(model => model.email)%> <%: Html.ValidationMessageFor(model => model.email)%> <div class="editor-label"> <%: Html.LabelFor(model => model.dateofbirth)%> <div class="editor-field"> <%: Html.EditorFor(model => model.dateofbirth)%> <%: Html.ValidationMessageFor(model => model.dateofbirth)%> <div>you must be 18 or older to participate. <div class="editor-label"> <%: Html.LabelFor(model => model.zip)%> <div class="editor-field"> <%: Html.TextBoxFor(model => model.zip)%> <%: Html.ValidationMessageFor(model => model.zip)%> <p> <input type="submit" value="next"/> </p> <% %> </aspcontent> La vue précise les champs de formulaire à utiliser pour recueillir les informations de contact. La validation se fait par le biais des annotations précisées sur le modèle de données de contact. Listing 3 [HttpPost] [CanvasAuthorize] Public ActionResult Index(Contact contact) FacebookApp app = new FacebookApp(); contact.partitionkey = app.userid.tostring(); if (ModelState.IsValid) contactrepository.save(contact); return this.canvasredirecttoaction("selectstore"); Return View(contact); En plus des informations de contact qui proviennent du formulaire, nous avons également récupéré les identifiants Facebook des utilisateurs depuis l objet «FacebookApp» et nous les avons assigné à la liste de contact afin de pouvoir les tracker lors de leurs prochaines visites sur l application. Garder les contacts dans le stockage Azure Dans le listing précédent, vous remarquerez que la propriété Contact qui provient des ID Facebook des clients est appelé «PartitionKey», et non «FacebookId». Le contact est un modèle de données et est destiné à être stocké directement dans le service de stockage Tables de Windows Azure. C est un dérivé de «TableStorageEntity», qui est une base pratique pour les entités stockables incluant les propriétés «PartitionKey» et «RowKey». 7

«AzureFacebookSample» utilise service de stockage Tables de Windows Azure car elles offrent des insertions rapides et des recherches clés et elles peuvent monter en charge virtuellement sans limite. Pour de meilleures performances, les recherches devraient se limiter à celles qui sont fondées sur les domaines clés et ne devraient pas inclure des propriétés supplémentaires. Nous conservons les contacts dans des services de stockage Tables de Windows Azure en utilisant l identifiant Facebook comme clé de partition et avec une clé de ligne vide. Il est donc très facile (et rapide) de faire ce que nous avons besoin avec les contacts stockés. Les web rôles et worker accèdent aux objets de contacts stockés au travers du «ContactRepository» fournis par le projet de domaine. Le «ContactRepository» fonctionne avec le stockage Azure au travers de classes dans le Windows Azure Toolkit, ce qui contribue à rendre la mise en œuvre simple. Listing 4 public class ContactRepository : IContactRepository readonly AzureTable<Contact> _table; public ContactRepository() var factory = new AzureStorageFactory (); _table = (AzureTable<Contact>) factory.gettable<contact>(); public Contact GetFromFacebookId(Int64 facebookid) return this.get(facebookid.tostring()); public Contact Get(string partitionkey) return _table.get(c => c.partitionkey == partitionkey && c.rowkey == ""); public void Save(Contact contact) _table.addorupdate(contact); public void Delete(Contact contact) _table.delete(contact); Le listing montre l implémentation entière du «ContactRepository». Dans le contrôleur, nous avons créé un «AzureStorageFactory» et ensuite utilisé l usine pour obtenir la table de contact. «AzureStorageFactory» et «AzureTable» sont des classes définies dans le Windows Azure Toolkit. A la fin du gestionnaire de poste, l application utilise le référentiel pour écrire les informations de contact dans le stockage Azure. Tant que le processus n est pas terminé, le contact n est pas marqué avec l indicateur «enregistré». Listing 5 if (AlreadyRegistered(app.UserId)) return this.canvasredirecttoaction("signupcomplete"); 8

Et l implémentation de cette vérification est simplement : Listing 6 private bool AlreadyRegistered(Int64 facebookid) Contact contact = contactrepository.getfromfacebookid(facebookid); Return (contact!= null) && contact.registered; Choisir un magasin Une fois que nous avons validé le formulaire de contact, nous passons à la demande de magasin. L application présente à l utilisateur une liste de trois magasins situés dans un rayon de 80 km par rapport au code postal qu il aura fourni. Nous avons débuté avec une liste de domaines publics de codes postaux américains à partir d un recensement de 1999. La liste comprend la latitude et longitude pour chaque code postal. Ensuite, nous générons une liste de 1 000 exemples de magasins parmi les codes postaux sélectionnés au hasard dans la liste. La liste de magasins est stockée dans la première Table Azure, téléchargée à partir d un fichier CSV. Cela ressemble à ceci : Listing 7 public class Store: TableServiceEntity // partition key is store number // row key is empty public Store() this.rowkey = ""; public string Name get; set; public string City get; set; public string State get; set; public string Zip get; set; Nous avons ensuite créé une seconde table, nommée «ZipStore», qui contient entre zéro et trois lignes pour chaque magasin dans le pays (en 1999). Chaque ligne est une paire code postal-magasin, en ne considérant que les trois magasins les plus proches de chaque code postal. Pour construire cette table, nous parcourrons la liste des code postaux, calculons la position de chaque magasin en utilisant une formule basée sur la latitude et la longitude et ne retenons que les trois plus proches de chaque code postal. Après 30 minutes de calculs, nous obtenons un fichier CSV que nous transfèrons à la table de stockage Azure. Listing 8 class ZipStore: TableServiceEntity // partition key is zip code // row key is distance rank (0 is nearest) public string StoreNumber get; set; 9

La partition clé stocke le code postal. Les clés de ligne représentent un rang de proximité pour chaque magasin. Ainsi, chaque partition représente un code postal, et chaque ligne d une partition représente un magasin proche de ce code postal. Maintenant, nous sommes en mesure d examiner le «StoreRepository» : Listing 9 public class StoreRepository : IStoreRepository readonly AzureTable<ZipStore> _zipstore; readonly AzureTable<Store> _store; public StoreRepository() var factory = new AzureStorageFactory (); _zipstore = (AzureTable<ZipStore>)factory.GetTable><ZipStore>(); _store = (AzureTable<Store>)factory.GetTable><Store>(); public IEnumerable<Store> GetNearbyStores(string ZipCode) var stores = new List<Store>(); Store store; ""); var query = _zipstore.query.where(zs => zs.partitionkey == ZipCode); foreach (ZipStore zs in query) store = _store.get(s => s.partitionkey == zs.storenumber && s.rowkey == if (store!= null) stores.add(store); Return stores; Le point intéressant ici est la méthode «GetNearbyStores()», que utilise le contrôleur pour charger la liste de magasins disponibles. La première requête ne précise que la clé de partition (code postal), et retourne les trois magasins. La requête retourne les magasins par ordre de distance car la clé de ligne est une distance. Ensuite, pour chaque magasin, nous utilisons le nombre de magasins en tant que clé de partition pour en sortir le nom du magasin, la ville, l état et le code postal. Bien qu il y ait un maximum de quatre requêtes nécessaires pour cette vue, elles se font toutes via des clés de partition et de ligne et sont très rapides. Magasin et file d attente Le gestionnaire pour «SelectStore» met à jour les contacts avec le magasin sélectionné par l utilisateur et stocke le contact. 10

Listing 10 [HttpPost] [CanvasAuthorize] public ActionResult SelectStore(SelectStoreViewModel model) FacebookApp app = new FacebookApp (); Contact contact = contactrepository.getfromfacebookid(app.userid); if (ModelState.IsValid) contact.storenumber = model.storenumber; contact.registered = true; contactrepository.save(contact); QueueContact(contact); return this.canvasredirecttoaction("signupcomplete"); Return View(model); Ci-dessous, l implémentation du «QueueContact» : Listing 11 private void QueueContact(Contact contact) // queue the contact for the worker role. ContactQueueMessage message = new ContactQueueMessage(); message.facebookid = contact.partitionkey; contactqueue.addmessage(message); Le Windows Azure Toolkit permet de mieux travailler avec les files d attente Azure. Les files d attente sont essentielles pour communiquer entre les rôles qui composent une application évolutive. «ContactQueue» est dérivé d un type Windows Azure Toolkit, en tant que «ContactQueueMessage», et rend la mise en œuvre plus simple. Mais le Windows Azure Toolkit est remarquablement efficace quand il s agit d extraire des messages de la file d attente dans le worker rôle. Extraire de la file d attente vers le worker rôle Le worker rôle s exécute en réponse à tous les messages de la file d attente. En utilisant le Windows Azure Toolkit, nous pouvons mettre en place un gestionnaire de file d attente dans le rôle «OnStart()». Nous avons juste besoin d ajouter ce code à la mise en œuvre par défaut : Listing 12 AzureStorageFactory factory = new AzureStorageFactory(); IAzureQueue<ContactQueueMessage> queue = factory.getqueue<contactqueuemessage>(azureconstants.contactqueuename); QueueHandler.For<ContactQueueMessage>(queue).Every(TimeSpan.FromSeconds(5)).Do(new EmailAndStoreContact()); Dans «OnStart», nous créons un «AzureStorageFactory» pour ensuite l utiliser pour trouver la file d attente de contact. Ensuite, nous avons mis en place un gestionnaire qui, dans ce cas, vérifiera la file d attente toutes les 5 secondes. La seule chose qui reste à faire est d écrire la partie «EmailAndStoreContact». La principale méthode est appelée «Run», et est mis en œuvre comme suit : 11

Listing 13 public void Run(ContactQueueMessage message) Contact contact = contactrepository.get(message.facebookid); if (contact!= null) // TODO: contact another service to send off the email with // the premium coupon here (outside the scope of this sample)! // store the contact to sql Azure. SQLContact sqlcontact = new SQLContact(); MapContactToSqlContact(contact, sqlcontact); sqlcontactrepository.add(sqlcontact); sqlcontactrepository.save(); Le processeur de message obtient les identifiants des contacts Facebook via la file d attente de messages et les utilisent pour tirer le contact du référentiel. Puisque nous n envoyons en réalité pas d email dans cette application, tout ce qui reste à faire est d afficher le contact dans SQL Azure. Nous travaillons ici avec un «SQLContact». Pourquoi migrer depuis un service de stockage Tables de Windows Azure vers SQL Azure? Car même si les tables Azure sont rapides, elles ne sont pas adaptées à des requêtes arbitraires. Déplacer les données de contact dans SQL Azure permet d avoir des rapports pour voir l évolution de votre campagne. 12

Point de départ Vous pouvez utiliser les sources de cette application en tant que point de départ pour votre campagne marketing sur Facebook. Comme indiqué précédemment, il y a des éléments à rajouter : Premièrement, la gestion des emails dans le worker rôle. Deuxièmement, il y a des éléments additionnels dans Facebook, tels que la possibilité d exécuter l application comme un onglet sur la page de l entreprise, offrant des incitations supplémentaires pour le client de «liker» la page et ainsi d obtenir un aspect plus viral de l application. Pour la plupart de ces fonctionnalités, il vous faudra travailler directement avec l API Facebook javascript. Mais, même si vous n avez jamais lancé votre propre campagne, il y a beaucoup de ressources pour les développeurs C# sur Azure : Premièrement, utilisez le Windows Azure Toolkit pour simplifier l accès aux tables de stockages Azure et aux files d attente. Ensuite, si vous développez une application Facebook, utilisez le SDK C# de Facebook. Troisièmement, utilisez les worker rôles pour séparer les tâches de fond. Et enfin, faites attention à la structure de stockage pour donner à votre applications les meilleures conditions en cas de montées en charge. 13