Georg fährt extra nach Berlin um Steve Ballmer zu treffen

31 Tage Mango | Tag #17: Windows Azure

Die­ser Arti­kel ist Tag #17 der Serie 31 Tage Man­go von Jeff Blan­ken­burg.

Der Ori­gi­nal­ar­ti­kel befin­det sich hier: Day #17: Using Win­dows Azu­re.

Die­ser Arti­kel wur­de in der Ori­gi­nal­se­rie von Gast­au­tor Micha­el Col­lier geschrie­ben. Bei Twit­ter kann Micha­el unter @michaelcollier erreicht wer­den.

Windows Phone + Windows Azure = ein starkes Team

Eini­ge der inter­es­san­tes­ten Win­dows Pho­ne Anwen­dun­gen nut­zen Ser­vices der ein oder ande­ren Art. Sol­che Ser­vices könn­ten z.B. Web­ser­vices sein, die Zugriff auf eine Geschäfts­lo­gik bie­ten — so wie wir das auch mit tra­di­tio­nel­len ASP.NET Anwen­dun­gen machen wür­den. Es könn­ten aber auch Daten­ser­vices sein, die Zugriff auf struk­tu­rier­te oder unstruk­tu­rier­te Daten bie­ten. Oder es könn­ten Iden­ti­täts­diens­te sein, wel­che die Authen­ti­fi­zie­rung für unse­re Anwen­dung über­neh­men.

Bis­he­ri­ger Ansatz

Typi­scher­wei­se stel­len wir einen oder meh­re­re Ser­ver auf und stel­len dann unse­re Ser­vices oder Daten dort bereit. Das kann rela­tiv teu­er sein — sowohl in Bezug auf Geld als auch was den Zeit­auf­wand betrifft. Wir müs­sen Zeit dar­auf ver­wen­den, die Ser­ver zu instal­lie­ren, sie zu kon­fi­gu­rie­ren und zu sichern. Wäh­rend des Betriebs müs­sen wir uns wei­ter­hin um die War­tung küm­mern (Hard­ware­aus­fäl­le, Sys­tem­up­dates, etc.). Auch die Vor­her­sa­ge, wie vie­le und was für Ser­ver wir brau­chen, ist nicht gera­de ein­fach. Kau­fen wir zu viel, haben wir Geld ver­schwen­det. Kau­fen wir zu wenig, wer­den die Kun­den (und die Chefs) auch nicht begeis­tert sein. Alle die­se Fak­to­ren zwin­gen uns als Anwen­dungs­ent­wick­ler, uns mit Infra­struk­tur­fra­gen aus­ein­an­der­zu­set­zen, wo wir doch viel bes­ser die nächs­te Kil­ler­an­wen­dung ent­wi­ckeln könn­ten.

Moder­ner Ansatz

Ein aktu­el­ler Trend ist, in der Cloud bereit­ge­stell­te Ser­vices (wohl­ge­merkt „Ser­vices“ und nicht „Ser­ver“) zu nut­zen. Die Platt­form Win­dows Azu­re stellt Com­pu­te Ser­vices zur Ver­fü­gung, die wir zur Bereit­stel­lung unse­rer Web­ser­vices nut­zen kön­nen. Wir schrei­ben nur noch die Anwen­dung und stel­len die­se bereit. Den Rest über­las­sen wir Win­dows Azu­re. Win­dows Azu­re bie­tet wei­ter­hin Zugriff auf hoch­ver­füg­ba­re und ska­lier­ba­re Spei­cher­diens­te in der Form von Tabel­len, Blobs und Queu­es („War­te­schlan­gen“).

  • Tabel­len sind ein semi-struk­tu­rier­ter Spei­cher­me­cha­nis­mus, der in der Lage ist, rie­si­ge Daten­men­gen zu ver­wal­ten (den­ken Sie dabei an NoS­QL, nicht an eine rela­tio­na­le Daten­bank).
  • Blobs ver­hal­ten sich im Wesent­li­chen wie ein rie­si­ges Datei­sys­tem. Hier kön­nen Sie able­gen, was immer Sie wol­len (Bil­der, Fil­me, Doku­men­te, etc.).
  • Queu­es sind ein leicht­ge­wich­ti­ger Mecha­nis­mus, um Nach­rich­ten zwi­schen nicht gekop­pel­ten Sys­te­men aus­zu­tau­schen.

Win­dows Azu­re bie­tet zusätz­lich einen Iden­tit­äs­ver­wal­tungs­dienst, die Access Con­trol Ser­vices (ACS), die eine ein­fa­che Mög­lich­keit bie­ten, Nut­zer über ver­schie­de­ne Iden­ti­täts­pro­vi­der zu authen­ti­fi­zie­ren. ACS ist so vor­kon­fi­gu­riert, dass es mit den gro­ßen sozia­len Netz­wer­ken, wie Face­book, Yahoo!, Win­dows Live ID und Goog­le, funk­tio­niert. ACS kann auch ver­wen­det wer­den, um die Iden­ti­täts­ver­wal­tung eines Unter­neh­mens über Active Direc­to­ry Fede­ra­ti­on Ser­vices (ADFSv2) zu rea­li­sie­ren. ACS ist beson­ders für mobi­le Anwen­dun­gen geeig­net, da die Anwen­der sol­cher Anwen­dun­gen meist schon ein Pro­fil bei einem der Diens­te haben. Win­dows Pho­ne Benut­zer haben z.B. schon eine Win­dows Live ID.

Es gibt zahl­rei­che Vor­tei­le durch die Ver­wen­dung einer Platt­form wie Win­dows Azu­re bei der Ent­wick­lung einer Win­dows Pho­ne Anwen­dung. Ers­tens geht es schnell! Sie kön­nen das Visu­al Stu­dio sowohl für die Pro­gram­mie­rung der Anwen­dung als auch zur Ent­wick­lung der Win­dows Azu­re Ser­vices ver­wen­den. Wenn der Code ein­mal geschrie­ben ist, ist die Bereit­stel­lung im Inter­net eine Sache von Minu­ten. Win­dows Azu­re kann außer­dem bil­lig sein. Sie kön­nen so vie­le Daten able­gen, wie sie möch­ten — für 0,14 $ pro Giga­byte und Monat. Da die gan­ze Enwick­lung lokal auf Ihrer Ent­wick­lungs­ma­schi­ne statt­fin­den kann, müs­sen Sie nichts bezah­len, bis Ihr Ser­vice tat­säch­lich in der Cloud läuft. All das ermög­licht uns, groß­ar­ti­ge Win­dows Pho­ne Anwen­dun­gen zu ent­wi­ckeln, ohne uns um die Infra­struk­tur zu küm­mern.

Packen wir’s an

Las­sen Sie uns kurz durch die Ent­wick­lung einer ein­fa­chen Win­dows Pho­ne Anwen­dung gehen, wel­che auf Ser­vices in der Win­dows Azu­re Platt­form zugreift.

Eini­ge ent­schei­den­de Aspek­te die­ser Archi­tek­tur (und der ein­ge­zeich­ne­ten Daten­flüs­se) sind:

  1. Anwen­der der Win­dows Pho­ne Anwen­dung sol­len sich authen­ti­fi­zie­ren. Gro­ße sozia­le Diens­te wie Face­book, Win­dows Live, Yahoo! und Goog­le sind hier­für sicher die logi­sche Wahl. Die­se Arbeit wer­den uns die Win­dows Azu­re Access Con­trol Ser­vices (ACS) abneh­men (dazu spä­ter mehr).
  2. Ein WCF REST Ser­vice wird unse­re Geschäfts­lo­gik ent­hal­ten und siche­ren Zugriff auf unse­re Daten erlau­ben.

Wich­tig hier­bei ist, wie das Tele­fon auf Tabel­len- und Blob-Daten in Win­dows Azu­re zugreift. Die nati­ve API für Win­dows Azu­re ist eine REST API. Das umfasst auch die Tabel­len und Blobs. Alle Zugrif­fe auf Win­dows Azu­re Sto­rage sind dabei durch Zugriffs­schlüs­sel gesi­chert. Ein Zugriffs­schlüs­sel muss bei jeder Anfra­ge (also jedem REST Auf­ruf) an Win­dows Azu­re mit über­ge­ben wer­den. Die Zugriffs­schlüs­sel soll­ten natür­lich vor unbe­fug­tem Zugriff sicher sein. Es ist des­halb kei­ne gute Idee, die Zugriffs­schlüs­sel im Tele­fon abzu­le­gen. Wür­den wir das tun, hät­ten wir unse­re gehei­men Schlüs­sel in die freie Wild­bahn gege­ben, mit mög­li­cher­wei­se schlim­men Fol­gen für uns. Es ist natür­lich mög­lich, die Zugriffs­schlüs­sel zu ändern (wenn einer bei­spiels­wei­se kom­pro­mit­tiert wur­de). Wenn die Schlüs­sel im Tele­fon lie­gen, müss­ten wir in die­sem Fall die Anwen­dung aktua­li­sie­ren. Um sicher zu gehen, erstel­len wir einen Pro­xy Web­ser­vice, durch den alle Zugrif­fe auf die in der Cloud gespei­cher­ten Daten gelei­tet wer­den. Damit blei­ben unse­re gehei­men Schlüs­sel geheim und wir kön­nen die Ser­vices „nach SOA Art“ ent­wi­ckeln.

Es gibt prin­zi­pi­ell zwei Wege, wie wir unse­ren Pro­xy Web­ser­vice ent­wi­ckeln kön­nen. Wir kön­nen dafür das von Micro­soft zur Ver­fü­gung gestell­te Win­dows Azu­re Tool­kit for Win­dows Pho­ne ver­wen­den. Die­ses ist eine Fund­gru­be für Quel­len und Bei­spie­le zur Ent­wick­lung von Win­dows Pho­ne Anwen­dun­gen, die Win­dows Azu­re Ser­vices ver­wen­den. Es ent­hält z.B. Pro­jekt­vor­la­gen zur Ver­wen­dung von ACS, Bei­spie­le zum Zugriff auf Sto­rage (Tabel­len, Blobs und Queu­es) und Best Prac­tices für Push Noti­fi­ca­ti­ons.

In unse­rem Arti­kel wer­den wir aller­dings ein­fach einen klei­nen WCF REST Ser­vice ent­wi­ckeln. Die­sen kön­nen wir leicht aus unse­rer Win­dows Pho­ne Anwen­dung ver­wen­den. Der Ser­vice wird nicht nur als Pro­xy beim Zugriff auf Win­dows Azu­re Sto­rage die­nen, er wird auch unse­re Geschäfts­lo­gik ent­hal­ten. Wenn wir woll­ten, könn­ten wir den Ser­vice noch so aus­bau­en, dass er bei­spiels­wei­se eine ASP.NET Web­an­wen­dung befeu­ert, oder auch ande­re mobi­le Platt­for­men bedient. Im heu­ti­gen Arti­kel wer­den wir nicht zu tief in die ver­schie­de­nen Aspek­te der Win­dows Azu­re Sto­rage ein­stei­gen. Das wird im Detail im Win­dows Azu­re Plat­form Trai­ning Kit behan­delt (sie­he dort Explo­ring Win­dows Azu­re Sto­rage).

Table Storage

Zu Beginn brau­chen wir eine ein­fa­che Enti­tät, die wir im Win­dows Azu­re Table Sto­rage able­gen wer­den.

public sealed class Car : TableServiceEntity
{
   /*
   * PartitionKey = make
   * RowKey = current date/time in UTC
   */
   public Car()
   {}

   public Car(string make, string model, int year, string description, string imageUrl)
   {
      PartitionKey = make;
      RowKey = DateTime.UtcNow.Ticks.ToString();
      Make = make;
      Model = model;
      Year = year;
      Description = description;
      ImageUrl = imageUrl;
   }

   public string Make { get; set; }
   public string Model { get; set; }
   public int Year { get; set; }
   public string Description { get; set; }
   public string ImageUrl { get; set; }
}

Jetzt kön­nen wir eine Metho­de in unse­rem WCF Ser­vice schrei­ben, die irgend­wel­che Geschäfts­lo­gik beinhal­tet (viel­leicht die Über­prü­fung eines Zugriffs­schlüs­sels o.ä.) und unse­re Enti­tät im Table Sto­rage ablegt (Ach­tung: die Car­Da­ta­Sour­ce ist eine simp­le Wrap­per-Klas­se, die uns Tei­le des Codes etwas ver­ein­facht — die kom­plet­te Klas­se kann im unten zum Down­load bereit­ste­hen­den Code ange­schaut wer­den.)

 public class CarService : ICarService
{
   public void AddCar(Car car)
   {
      try
      {
         var key = ValidateApplicationKey();
         if (key)
         {
            var carDataSource = new CarDataSource();
            carDataSource.CreateCar(car);
         }
      }
      catch (Exception)
      {
         throw new WebFaultException<string>("Failed to create a new car.", HttpStatusCode.InternalServerError);
      }
   }
}

Jetzt, wo der Ser­vice bereit ist, kön­nen wir ihn aus unse­rer Win­dows Pho­ne Anwen­dung auf­ru­fen — genau wie wir jeden ande­ren REST­ful Web­ser­vice auf­ru­fen wür­den. Der gesam­te Code kann unten her­un­ter­ge­la­den wer­den.

Blob Storage

Wir zuvor erwähnt, dient Win­dows Azu­re Blob Sto­rage dazu, belie­bi­ge Inhal­te, wie z.B. PDF Doku­men­te, Bil­der, Fil­me oder jede ande­re Datei abzu­le­gen. Jede Datei stellt dabei einen „Blob“ dar. Blobs wie­der­um leben in Con­tai­nern. Con­tai­ner (und damit die beinhal­te­ten Blobs) sind nor­ma­ler­wei­se nur zugreif­bar, wenn man den ent­spre­chen­den Zugriffs­schlüs­sel hat (der sel­be Schlüs­sel, der auch für Table Sto­rage ver­wen­det wird). Wenn wir den Zugriffs­schlüs­sel haben, kön­nen wir belie­bi­ge Ope­ra­tio­nen aus­füh­ren (lesen, schrei­ben, löschen, etc.). Man kann die Zugriffs­rech­te auch so ändern, dass anony­mer Lese­zu­griff erlaubt ist — bei­spiels­wei­se, wenn wir jedem erlau­ben wol­len, Bil­der aus einer Win­dows Pho­ne Anwen­dung zu betrach­ten.

Was, wenn wir jeman­dem den Zugriff nur für einen bestimm­ten Zeit­raum und nur mit bestimm­ten Rech­ten erlau­ben möch­ten? Die Ant­wort ist die Ver­wen­dung einer Sha­red Access Signa­tu­re (SAS). Eine Sha­red Access Signa­tu­re ist ein spe­zi­ell erzeug­ter URL Que­ry String, wel­cher die gewähr­ten Rech­te (nur erstel­len, nur löschen, erstel­len und löschen, etc.) und den Gül­tig­keits­zeit­raum beinhal­tet. Wir kön­nen eine SAS erzeu­gen und die­se dem­je­ni­gen zur Ver­fü­gung stel­len, dem wir Zugriff auf unse­re Blob Sto­rage gewäh­ren möch­ten. In unse­rem Bei­spiel kön­nen wir von unse­rem WCF REST Ser­vice eine Sha­red Access Signa­tu­re bean­tra­gen und die­se SAS URL dann ver­wen­den, um Bil­der direkt vom Tele­fon im Win­dows Azu­re Blob Sto­rage zu spei­chern.

Der Pro­zess zur Erzeu­gung einer Sha­red Access Signa­tu­re geht wie folgt:

public Uri CreateCarImageSharedAccessSignature()
{
   Uri signatureUri = null;
   var key = ValidateApplicationKey();

   if (key)
   {
      try
      {
         CloudBlobContainer container = CreateContainer("cars");
        
         // Set permissions on the container.
         var sas = container.GetSharedAccessSignature(
            new SharedAccessPolicy
            {
               Permissions =
                  SharedAccessPermissions.Write |
                  SharedAccessPermissions.List,
               SharedAccessStartTime = DateTime.UtcNow,
               SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromMinutes(5)
            });

         // Trim the leading '?' to prevent there from being two in the resulting URI.
         var uriBuilder = new UriBuilder(container.Uri) {Query = sas.TrimStart('?')};
         signatureUri = uriBuilder.Uri;
      }
      catch (Exception ex)
      {
         throw new WebFaultException<string>(ex.Message, HttpStatusCode.InternalServerError);
      }
   }

   return signatureUri;
}

Access Control

Wir haben jetzt die grund­le­gen­den Mecha­nis­men fer­tig, um auf die Sto­rage Diens­te von Win­dows Azu­re zuzu­grei­fen. Las­sen Sie uns jetzt eine Authen­ti­fi­zie­rungs­mög­lich­keit für die Anwen­der ein­bau­en. Wir sind vor­hin schon kurz auf die Access Con­trol Ser­vices (ACS) von Win­dows Azu­re ein­ge­gan­gen. ACS erlaubt uns die Authen­ti­fi­zie­rung von Benut­zern über Face­book, Yahoo!, Win­dows Live ID und Goog­le ohne eine Zei­le Code schrei­ben zu müs­sen. Wenn der Benut­zer authen­ti­fi­ziert ist, bekom­men wir eine Rei­he von Aus­sa­gen über den Benut­zer zurück (typi­scher­wei­se sei­nen Namen und sei­ne Email-Adres­se). Die­se Daten kön­nen wir ver­wen­den, um die Anwen­dung zu per­so­na­li­sie­ren oder um eine Art Regis­trie­rung durch­zu­füh­ren (in der wir bei­spiels­wei­se wei­te­re Infor­ma­tio­nen abfra­gen). Wel­chen Iden­ti­täts­pro­vi­der wir ver­wen­den, liegt in unse­rer Hand — das ist nur eine Fra­ge der Kon­fi­gu­ra­ti­on.

ACS ist ein mäch­ti­ger, aber ein­fach zu ver­wen­den­der Dienst. Um mehr über ACS zu erfah­ren, besu­chen Sie http://www.microsoft.com/windowsazure/learn/control-access/#introductory.

Micro­soft hat vor kur­zem ein NuGet Paket her­aus­ge­bracht, wel­ches die Ver­wen­dung von ACS ziem­lich sim­pel macht. Durch das NuGet Paket kön­nen wir ACS schnell und mit mini­ma­len Abhäng­kei­ten zu unse­rem Pro­jekt hin­zu­fü­gen. Sie fin­den das NuGet Paket, wenn Sie im Mana­ge NuGet Packa­ges Werk­zeug des Visu­al Stu­di­os nach „Access Con­trol Ser­vice“ suchen.

Alter­na­tiv kön­nen Sie das NuGet Paket über die NuGet packa­ge manage­ment Kon­so­le instal­lie­ren.

PM> Install-Packa­ge Phone.Identity.AccessControl.BasePage

Bei­de Wege wer­den die nöti­gen Con­trols und Platz­hal­ter zur Ver­wen­dung von ACS in Ihrer Win­dows Pho­ne Anwen­dung instal­lie­ren. Nach der Instal­la­ti­on kön­nen Sie der mit­ge­lie­fer­ten Anlei­tung zur Kon­fi­gu­ra­ti­on der Win­dows Pho­ne Anwen­dung für ACS fol­gen. Die Ver­wen­dung des NuGet Pakets zur Ver­wen­dung von ACS in Win­dows Pho­ne ist immer noch ver­gleichs­wei­se fort­ge­schrit­ten, da die ACS Kon­fi­gu­ra­ti­on uns über­las­sen wird. Es gibt aber eine detail­lier­te Anlei­tung hier, die uns Schritt für Schritt durch die Erstel­lung eines neu­en ACS Name­spaces und die nöti­ge Kon­fi­gu­ra­ti­on führt. Auf­ga­be 2 in die­ser Anlei­tung ist mög­li­cher­wei­se ein guter Ein­stiegs­punkt, wobei die gan­ze Anlei­tung sehr lesens­wert ist.

Push Notifications

Wenn wir wol­len, ist es auch sehr ein­fach, Unter­stüt­zung für Push Noti­fi­ca­ti­ons hin­zu­zu­fü­gen. Wie­der gibt es ein NuGet Paket, wel­ches die nöti­gen Schrit­te stark ver­ein­facht — ähn­lich wie bei der Ein­bin­dung der Access Con­trol Ser­vices. Der Pro­zess ist in die­sem Chan­nel 9 Video anschau­lich demons­triert.

Die NuGet Pake­te zur Unter­stüt­zung von Push Noti­fi­ca­ti­ons sind:

PM> Install-Packa­ge Phone.Notifications.BasePage (Cli­en­t/­Te­le­fon-sei­ti­ge Biblio­the­ken — die­se machen die Regis­trie­rung mit dem Push Noti­fi­ca­ti­on Cloud Ser­vice)

PM> Install-Packa­ge CloudServices.Notifications (Ser­ver-sei­ti­ge Biblio­the­ken — die­se küm­mern sich um die Kom­mu­ni­ka­ti­on mit dem Micro­soft Push Noti­fi­ca­ti­on Ser­vice)

Micro­soft hat kürz­lich eini­ge NuGet Pake­te her­aus­ge­bracht, die die Arbeit mit Win­dows Azu­re aus unse­ren Win­dows Pho­ne Anwen­dun­gen zum Kin­der­spiel machen. Es gibt Pake­te für ACS, Push Noti­fi­ca­ti­ons und Mem­bership (tra­di­tio­nell über Benut­zer­na­me und Kenn­wort). Schau­en Sie sich die­se Pake­te an, da sie sich leicht mit der vor­han­de­nen Funk­tio­na­li­tät Ihrer Anwen­dung ergän­zen.

Zusammenfassung

Wir haben jetzt unse­re eige­ne klei­ne Cloud-befeu­er­te Win­dows Pho­ne Anwen­dung. Wir haben in die­sem Arti­kel gese­hen, wie wir eini­ge Diens­te der Win­dows Azu­re Cloud Platt­form für unse­re Anwen­dun­gen nut­zen kön­nen. Wir haben gese­hen, wie wir einen Web­ser­vice ent­wi­ckeln kön­nen, der unse­re Geschäfts­lo­gik ent­hält und der als Pro­xy für die Win­dows Azu­re Sto­rage Diens­te fun­giert. Wir haben eben­falls gese­hen, wie ein­fach wir Face­book, Yahoo!, Win­dows Live ID oder Goog­le Authen­ti­fi­zie­rung mit Hil­fe eines NuGet Pakets in unse­re Anwen­dung inte­grie­ren kön­nen.

Um den kom­plet­ten Quell­code die­ses Arti­kels her­un­ter­zu­la­den, kli­cken Sie auf den Down­load Code But­ton unten.

Um mit Win­dows Azu­re zu star­ten, kön­nen Sie ein 90-tägi­ges, kos­ten­lo­ses Test­abo abschlie­ßen: http://www.microsoft.com/windowsazure/free-trial/.

Weitere Informationen

Mor­gen wer­den wir Bei­spiel­da­ten dis­ku­tie­ren und wie wir die­se mit Expres­si­on Blend sehr ein­fach erzeu­gen kön­nen.

Bis dahin!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert