Freigeben über


Windows Azure

Windows Azure hilft

Mark Kromer

Vergangenes Frühjahr veranstaltete die Marketingabteilung des Microsoft Mid-Atlantic District eine Konferenz mit rund 90 Führungskräften von Fortune-500-Unternehmen, Microsoft-Partnern und Microsoft-Mitarbeitern. Für diese Veranstaltung wurde ein Registrierungssystem gewünscht, bei dem die neuesten und besten Microsoft-Technologien ins rechte Licht gerückt werden und die Teilnehmer hautnah erleben können, was Microsoft Neues zu bieten hat. Da ich als Lösungsarchitekt und Berater bereits in der Vergangenheit erfolgreich Lösungen erstellt hatte, wandte sich die Marketingabteilung an mich. Es gab allerdings noch keine fest definierte Richtung, welche Technologien vorgeführt werden sollten und wie das Ganze auszusehen hatte. Und zu alledem kam noch die Herausforderung, dass die Konferenz schon in einem Monat stattfinden sollte.

Bei Microsoft erarbeite ich zusammen mit großen Unternehmen Lösungen, die auf der sogenannten Microsoft-Datenplattform aus SQL Server und der Windows Azure SQL-Datenbank aufbauen. Ich wandte mich daher sofort den Platform-as-a-Service-Möglichkeiten (PaaS) von Windows Azure zu, denn darin sah ich die einzige Möglichkeit, die Vorgaben der Marketingabteilung zu erfüllen. Mit Windows Azure können Lösungen auf Basis der Microsoft-Anwendungsplattform (Microsoft .NET Framework, SQL Server und Windows Server) schnell bereitgestellt werden. Damit stand fest, wie ich vorgehen wollte. Über das Windows Azure-PaaS-Modell regelt Microsoft Infrastruktur, Energie, Server, Wartung, Patching, Upgrades und so weiter über weltweit verteilte Microsoft-Rechenzentren. Da ich mit diesem Modell weder eigene Hardware aufstellen noch eine eigene Infrastruktur aufbauen musste, war es perfekt zur Erfüllung der Vorgaben geeignet.

Mit der Marketingabteilung und meinem Vorgesetzten hatte ich vereinbart, dass ich nur in meiner Freizeit und am Wochenende an diesem Projekt arbeiten würde. Deshalb entschied ich mich mit Silverlight, Windows Communication Foundation (WCF) und SQL Server für bereits gut bekannte Technologien, mit denen sich der Produktionszustand schnell erreichen lässt. Schließlich konnte ich eine stabile Lösung entwickeln, die gute Ergebnisse lieferte und für die ich positive Rückmeldungen bekam. Das Projekt hat gezeigt, dass sich selbst in kurzer Zeit und ohne Budget mit herkömmlicher Microsoft-Technologie hervorragende Lösungen erzielen lassen. Ich hoffe, diese Beschreibung, wie mit minimaler Anstrengung Windows Azure, die Windows Azure SQL-Datenbank und Windows Phone eingesetzt werden können, ist für Sie eine aufschlussreich und informativ.

Bei diesem Projekt musste ich mich hauptsächlich auf zwei Vorgaben konzentrieren. Erstens sollte die Interaktion der Teilnehmer mit neuen Geräten der Konferenzpartner, wie Tablets, Slate-PCs und Telefone, einfach und überzeugend sein. Zweitens sollte das neue Metro-Design im Vordergrund stehen, das Microsoft auf allen Geräten einsetzt. Ich hatte keine Zeit, die Community Technology Previews von Windows 8 und Visual Studio 11 zu laden, um so eine systemeigene Metro-Anwendung zu entwickeln. Da ich bereits seit mehreren Monaten mit der Windows Phone 7.5-Entwicklung befasst war, entschied ich mich für eine Hybrid-Lösung mit Silverlight. Diese Hybrid-Lösung wäre dann sowohl für Anwendungen im Windows 8-Desktopmodus und in systemeigenen Windows Phone-Anwendungen einsetzbar.

Im Rahmen der Projektvorgaben entwickelte ich eine Anwendung zum Teilnehmer-Check-in. Über die Anwendung sollten sich die registrierten Konferenzteilnehmer bei ihrer Ankunft selbst am Registrierungsschalter einchecken. So konnte ich die Vorgabe erfüllen, eine funktionelle und interaktive Anwendung zu entwickeln. Für die Metro-Benutzeroberfläche kam das Silverlight 5.0-Steuerelement PivotViewer zum Einsatz. Da ich die interaktiven Themen und Darstellungen bei der Bedienung von Geräten mit verschiedenen Formfaktoren beibehalten wollte, erstellte ich eine Windows Phone-App auf Basis des Panorama-Steuerelements. Über die App konnten die Microsoft-Mitarbeiter bei der Konferenz den Gästen die Möglichkeit bieten, über ihre Geräte einzuchecken oder sich Fotos von der Veranstaltung anzusehen. Gäste, die selbst ein Gerät mit Windows Phone dabei hatten, konnten die App im Marketplace herunterladen. Auf der technologischen Seite war die Entscheidung für Windows Azure naheliegend, und sie fiel mir somit nicht schwer. Als Datenbank nutzte ich die Windows Azure SQL-Datenbank, für Nachverfolgungsberichte Windows Azure SQL Reporting, für den Datenaustausch Windows Azure WCF-Dienste und zum Speichern der Veranstaltungsfotos Windows Azure Binary Large Object-(BLOB)-Speicher.

Übersicht über die Lösung

Für diesen Artikel teile ich die Lösungsarchitektur in drei Hauptbereiche ein: die Windows Azure Web-Apps, Windows Azure SQL-Datenbank und Windows Azure SQL Reporting sowie die Windows Phone-App. Zudem umfasste die gesamte Lösung noch ein paar zusätzliche nette Apps und Features, deren ausführliche Beschreibung den Rahmen dieses Artikels sprengen würde. Wenn Sie aber eine eigene Lösung für eine Konferenz oder Veranstaltung der gleichen Größe (bis zu 300 Teilnehmer) erstellen möchten, sollten Sie sich unbedingt noch mit den folgenden Themen beschäftigen:

  1. Fotos hochladen und teilen: Ich habe das Tool zum Hochladen von Bildern aus dem Windows Azure-Toolkit verwendet. Dieses Tool nimmt die Bilder von einem lokalen Speicher und lädt sie in den Windows Azure-BLOB-Speicher hoch. Das Tool muss nicht konfiguriert werden. Sie müssen lediglich den Windows Azure-Speicherschlüssel anschließen und die Datei „Default.aspx“ an das eigene Design anpassen. Die hochgeladenen Bilder konnten von den Benutzern bei der Veranstaltung über eine Fotogalerie auf Großbildschirmen oder auf Demotischen mit anderen geteilt werden. Es empfiehlt sich, noch ein Tool für die Dateiverwaltung auf dem Windows Azure-Speicher herunterzuladen, damit Sie die Dateien nach dem Hochladen einfach verwalten können. Solch ein Tool, der Windows Azure-Speicher-Explorer, ist bei CodePlex unter bit.ly/H3rOC erhältlich.
  2. Social Networking: Für eine App dieser Art ein absolutes Muss. Ermöglichen Sie den Teilnehmern von öffentlichen Konferenzen und Veranstaltungen das Teilen von Fotos, Kommentaren, Tweets, Updates, Konversationen usw. Für diesen Zweck habe ich in der Windows Phone-App einfach zu einer eigens dafür erstellten Facebook-Gruppe verlinkt, und in der Web-App (Beschreibung folgt weiter unten) kam das Facebook-C#-SDK für ASP.NET zum Einsatz, das Sie hier bekommen: bit.ly/J5D2zI.
  3. Silverlight-Fotogalerieanzeige: Dieses Feature möchte ich hier nur kurz anreißen. Ich brauchte eine schnelle Lösung, um Bilder auf einer Leinwand im Hauptkonferenzraum anzuzeigen. Da die Bilder im Windows Azure-Speicher lagen, konnte die Seite manuell aktualisiert werden, und sie konnte die Bilder in einer Endlosschleife anzeigen. Auch die Anzeige auf Laptops mit der Möglichkeit für die Benutzer zur Interaktion war möglich. Das Steuerelement und die XML-Konfigurationen hatte ich von CodePlex (slideshow.codeplex.com). Es gibt noch viele andere Bildanzeigekomponenten, die infrage kommen. Wenn Sie den gleichen Weg mit Windows Azure-Speicher gehen möchten, ist das wichtigste Kriterium, dass die Komponente Bilder von einer Web-URL rendern kann. Ich habe vorher schon Windows Azure-Speicher eingesetzt und dann auf einfache http://-Links direkt zu den JPG- und PNG-Grafikdateien zurückgegriffen.

Für die Fertigstellung der Lösung blieb mit nur wenig Zeit. Aber mit Windows Azure konnte ich all diese verschiedenen Puzzlestücke in kurzer Zeit zusammenfügen. Möglich war das, da das PaaS-Angebot .NET, Windows Server, Windows Azure-Speicher und die Windows Azure SQL-Datenbank umfasst. Sobald ich also herausgefunden hatte, welche feinen Unterschiede beim Hinzufügen eines Windows Azure-Projekts zu meinen Visual Studio 2010-Lösungen zu beachten waren, konnte ich mich auf meine Erfahrungen mit .NET, SQL Server und Windows Server stützen. Auf einige dieser Punkte werde ich weiter unten in der Lösungsbeschreibung noch einmal eingehen. Letzten Endes handelte es sich bei der Konferenz um eine einmalige Veranstaltung, und ich brauchte keine Infrastruktur zu erwerben. Stattdessen habe ich die Komponenten über mein Windows Azure-Konto bereitgestellt und nach der Veranstaltung einfach deaktiviert. Wenn diesen Sommer noch eine SQL Saturday-Veranstaltung auf mich zukommt, werde ich wahrscheinlich die Komponenten einfach wieder aktivieren und das Konferenzsystem wiederverwenden. Windows Azure wird ähnlich wie die Telefonrechnung jeden Monat auf Grundlage der tatsächlichen Nutzung abgerechnet. Und die Skalierung kann sich an den Benutzeranforderungen orientieren, ohne dass ich übermäßige Infrastruktur für Worst-Case-Szenarien vorhalten muss.

Windows Azure-Web-Apps

Ich beginne mit dem Haupteingabebildschirm für die Registrierungs-App. Dieser wird über eine in Windows Azure gehostete C#-.NET-Web-App mit einem Silverlight 5.0-XAML-Steuerelement realisiert. Der Unterschied bei der Entwicklung für Windows Azure im Vergleich zu herkömmlichen .NET-Projekten in Visual Studio ist das Framework für die Hostdienste in Windows Azure, über die die WCF-Dienste und die Web-Apps gehostet werden. Die C#-Klasse enthält im Namespace der obersten Ebene benutzerdefinierte Klassen, mit denen von der Windows Azure SQL-Datenbank eingehende Daten in Silverlight-Eigenschaften umgewandelt werden. Auf der Webebene sehen Sie die klassischen XML-Dateien (z. B. crossdomain.xml), die domänenübergreifende Aufrufe von der Webebene (also Silverlight) an einen Datendienst im Back-End zulassen. Diese Web-App übernimmt in meinem Windows Azure-Dienst die primäre Rolle, da ich ihr in meinem Projekt die Webrolle zugewiesen habe.

Für diese App habe ich mich mit dem PivotViewer-Steuerelement für eines meiner bevorzugten Silverlight-Steuerelemente aus den Windows Live Labs (inzwischen Teil von Silverlight 5.0) entschieden.

Das PivotViewer-Steuerelement eignet sich allgemein für solche Anwendungen, die eine einfache Navigation und eine interaktive Benutzeroberfläche erfordern, über die der Benutzer problemlos durch große Datenmengen navigieren, sie kategorisieren und sortieren kann (siehe Abbildung 1).

The PivotViewer Control Utilized as a Tile Interface for Registered AttendeesAbbildung 1: Kacheloberfläche für registrierte Teilnehmer realisiert mit dem PivotViewer-Steuerelement

Mit dem PivotViewer-Steuerelement lassen sich auch die Benutzeraktionen anpassen. Findet ein Teilnehmer seinen Namen auf einer Kachel, kann er durch einen Klick auf diese Kachel einchecken (siehe Abbildung 2). Die farbige Kacheloberfläche von PivotViewer wurde von den Veranstaltern der Microsoft-Konferenz ausgewählt, da sie mit der Metro-Oberfläche von Windows 8 und der Kacheloberfläche von Windows Phone vergleichbar ist. Am Registrierungsschalter bei der Konferenz sprachen die Benutzer gut auf diese Oberfläche an. Die Kacheln waren der perfekte Fingereingabemechanismus, über den sich die Teilnehmer an großformatigen Touchscreenmonitoren selbst einchecken konnten. Ein weiterer Vorteil dieses Steuerelements ist die integrierte Sortiermöglichkeit. Die Sortierreihenfolge basiert auf den Eigenschaften der Daten und ermöglicht so die einfache Anordnung nach Nachnamen.

The PivotViewer Zooms in on a Selected Name So the User Can Check InAbbildung 2: Vergrößern eines ausgewählten Namens mit PivotViewer zum Einchecken des Teilnehmers

Das Aussehen der Kacheln in PivotViewer lässt sich ändern, indem PivotViewerItemTemplate Attribute hinzugefügt werden. Hier sehen Sie, wie ich einen Farbkonverter hinzugefügt und den Teilnehmernamen mit dem Attribut „ShortName“ festgelegt habe:

<conv:TextToSolidColorConverter x:Key="colorConverter"/>
<pivot:PivotViewerItemTemplate x:Key="DemoTemplate">
  <Border Width="300" Height="300" 
    Background="{Binding Color,
    Converter={StaticResource colorConverter}}">
  <TextBlock Text="{Binding ShortName}" 
    FontWeight="ExtraBold"
    FontSize="42"HorizontalAlignment="Center" 
    VerticalAlignment="Center"
    TextWrapping="Wrap" />
 </Border>           
</pivot:PivotViewerItemTemplate>

Die Farbe wird lediglich über eine Schleife durch die Teilnehmerliste und die Änderung der Elementnummereigenschaft festgelegt. Das XAML für die Farbe wird in der Konverterklasse festgelegt:

var xaml = "<LinearGradientBrush xmlns='https://schemas.microsoft.com/client/2007' 
  StartPoint=\"0.5,0\" EndPoint=\"0.5,1\">" +
  "<GradientStop Color=\"Black\" Offset=\"0.0\" />" +
  "<GradientStop Color=\""+value.ToString()+"\" Offset=\"0.15\" />" +
  "<GradientStop Color=\"SlateGray\" Offset=\"0.85\" />" +
  "</LinearGradientBrush>";

Für die Bindung der Daten von der Windows Azure SQL-Datenbank an das Silverlight-Front-End habe ich einen über Windows Azure gehosteten WCF-Dienst erstellt. Beim Entwickeln von Webanwendungen in Windows Azure besteht die Möglichkeit, die WCF-Webdienste im eigenen Windows Azure-Konto zu speichern. Ich habe meinen WCF-Dienst speziell dafür erstellt, dass er in meiner Lösung als mittlere Ebene fungiert, wodurch Datenbankdaten von der Windows Azure SQL-Datenbank verfügbar gemacht werden. In Abbildung 3 ist zu sehen, welche Option in Visual Studio 2010 zum Erstellen eines neuen WCF-Diensts für Windows Azure ausgewählt wird.

The WCF Service Web Role in Windows Azure
Abbildung 3: Die WCF-Dienst-Webrolle in Windows Azure

Die Bereitstellung einer Lösung mit Windows Azure wird über verschiedene Bereiche der Windows Azure-Verwaltungskonsole (siehe Abbildung 4) realisiert. Was die PivotViewer-Web-App, den WCF-Dienst und die Web-App für den Check-in betrifft, werden alle Komponenten im Bereich „Gehostete Dienste“ bereitgestellt und gespeichert. Weiter unten in diesem Artikel komme ich noch auf die Bereiche „Datenbank“, „Berichterstellung“ und „Speicher“ zu sprechen. Eine Webanwendung bereitzustellen, bedeutet im Windows Azure-Jargon, einen gehosteten Dienst mit einer ASP.NET-Webrolle zu erstellen. Der von mir erstellte WCF-Datendienst für den Zugriff auf die Windows Azure SQL-Datenbank ist zwar auch ein gehosteter Dienst, doch dieser hat stattdessen eine WCF-Dienst-Webrolle. In jedem Fall erhalten Sie einen Domänennamen der Domäne cloudapp.net, bei dem ein von Ihnen vergebener Dienstname der URL vorangestellt wird. Wenn Sie Ihren eigenen Domänennamen verwenden möchten, müssen Sie Ihren Domänennamen dem Windows Azure-kompatiblen DNS-Namen zuordnen. Wie das geht, ist in dem Artikel „Konfigurieren einer benutzerdefinierten Domäne für einen gehosteten Windows Azure-Dienst“ in der MSDN Library (bit.ly/MfSBaD) beschrieben.

The Windows Azure Management Console
Abbildung 4: Die Windows Azure-Verwaltungskonsole

Bei dem WCF-Dienst handelt es sich um einen unkomplizierten Webdienst für die Abfrage von Daten aus der Windows Azure SQL-Datenbank, um so Teilnehmerinformationen zu erhalten. Außerdem enthält der Dienst eine Methode zur Aktualisierung des Teilnehmerstatus. Über die Auswahl seines Namens auf einer PivotViewer-Kachel kann der Teilnehmer seinen Status von „Eingecheckt“ in „Ausgecheckt“ ändern und umgekehrt.

Für den Zugriff auf eine Datenbank in der Windows Azure SQL-Datenbank wird eine Verbindungszeichenfolge verwendet, die sich nicht von der einer klassischen SQL Server-Datenbank unterscheidet. Code, Codeausschnitte und vorherige Codes lassen sich sehr einfach nach Windows Azure verschieben, da die Verbindungstypen und Mechanismen identisch sind. Der Code in Abbildung 5 stammt aus meinem WCF-Dienst und zeigt den Zugriff auf die Datenbank der Windows Azure SQL-Datenbank. Dafür verwende ich die Entity Framework-Klasse „Register“, mit der die Verbindung zur Windows Azure SQL-Datenbank auf dieselbe Weise hergestellt wird wie bei jeder anderen SQL Server-Datenbank auch.

Abbildung 5: Einsatz des WCF-Diensts zur Interaktion mit der Windows Azure SQL-Datenbank

namespace WCFServiceConference
{
  public class Service1 : IService1
  {
    // MyData is used to retrieve the attendee list      
    public List<String> MyData(int value)
    {       
      List<String> results = new List<String>();
      using (retreatEntities context = new retreatEntities())
      {
        IQueryable<Register> sortedContacts = context.registers
          .OrderBy(c => c.lastname)
          .ThenBy(c => c.org);
        // Register is the EF class
        foreach (Register sortedContact in sortedContacts)
        {
          results.Add(sortedContact.lastname + ", " + 
            sortedContact.email +
            "    (" + sortedContact.firstname + ") : " + 
            sortedContact.org);
        }
      }
      return results;
    }
    // Use this method to check in attendees and check out
    public void ToggleRegister(String lname, String fname)
    {           
      using (retreatEntities context = new retreatEntities())
      {
        IQueryable<register> sortedContacts = context.registers;
        try
        {
          Register qry = (from register in context.Registers
                          where Register.lastname == @lname &&
                          Register.firstname == @fname
                          select Register).First();
          // checkinis a binary SQL Server field, so I’m using byte array to set it
          byte[] s1 = qry.checkin;
          // We’re going to toggle the checkin value where 1 == checked-in
          if (s1[0] == 0)
          {
            s1[0] = 1;
            // Set the check-in date/time field in SQL
            qry.checkdate = DateTime.Now.ToString();
          }
          else
          {
            s1[0] = 0;
            qry.checkdate = null;
          }
          qry.checkin = s1;
          // Now let’s save our changes
          context.SaveChanges();
        }
        catch (Exception) { }
      }
    }
  }
}

Nach der Veröffentlichung von Diensten in Windows Azure können Sie die Dienste in Visual Studio-Projekten wie gewohnt mit Dienstverweisen referenzieren (siehe Abbildung 6). Windows Azure ist dadurch hervorragend für öffentliche Webdienste geeignet.

Referencing the Windows Azure-Hosted WCF Service in the Web App
Abbildung 6: Verweis auf den in Windows Azure gehosteten WCF-Dienst in der Web-App

Die Cloud-Datenbank und mit ihr die Cloud-Dienste zur Interaktion mit den Daten habe ich nun fertig gestellt und veröffentlicht. Jetzt kann ich über die Silverlight PivotViewer-App unter Einsatz eines asynchronen Diensts mit den Diensten interagieren. Da die Interaktion mit dem Datendienst asynchron verläuft, müssen Sie eine entsprechende lokale Ereignismethode einrichten, mit der die Daten bei Eingang erfasst und in die Clientkomponente überführt werden. In meinem Fall ist das eine einfache Liste mit Zeichenfolgen. Wird die snames-Eigenschaft meiner Klasse aktualisiert, empfängt die Silverlight-Komponente die Aktualisierungen über die Datenbindung (siehe Abbildung 7).

Abbildung 7: Über einen WCF-Dienst empfangene Aktualisierungen durch die Datenbindung in der Silverlight-Komponente

public static Service1Client _sc;
// This init method is in my MainPage.xaml file
// and is called right after InitializeComponent()
public static void init()
{
  _sc = new Service1Client();
  _sc.MyDataCompleted +=
    new EventHandler<MyDataCompletedEventArgs>(_sc_MyDataCompleted);
  _sc.MyDataAsync(1);
}
public static void _sc_MyDataCompleted(object sender, 
  MyDataCompletedEventArgs e)
{
  // How many rows were returned?
  snamescnt = e.Result.Count;
  snames = new List<string>();
  for (int i = 0; i < snamescnt-1; i++)
  {
    snames.Add(e.Result[i].ToString());
  }
}

Des Weiteren umfasst die Lösung eine kleine ASP.NET-Web-App, die eine Bestätigung anzeigt, die Check-in-Anforderung ausgibt und mit Facebook verknüpft ist, sodass sich die Teilnehmer über eine Facebook-Gruppe vernetzen können. Die Aufrufe an den WCF-Dienst zur Aktualisierung der Datenbank sind wesentlich unkomplizierter, da ASP.NET über serverseitige Funktionen verfügt, die Silverlight nicht aufweist. Am folgenden Code ist zu sehen, wie einfach sich der Dienst einsetzen lässt:

String lname = Request["lname"];
String fname = Request["fname"];
// No need to use async event calls from ASP.NET // Just reference the Web service and call the method directly
Service1Client sc = new Service1Client();
sc.ToggleRegister(lname, fname);
Label1.Text = "CHECKING IN " + fname.ToUpper() + " " + lname.ToUpper();

Diese ASP.NET-Seite wurde im Anschluss als Webrolle direkt in meinem Windows Azure-Konto bereitgestellt (siehe Abbildung 8).

Adding an ASP.NET Web Role for Simple Web Pages
Abbildung 8: Hinzufügen einer ASP.NET-Webrolle für einfache Webseiten

Die Windows Phone-App

Windows Phone-Apps werden mit Silverlight erstellt. In Visual Studio 2010 wählen Sie dafür die Projektvorlage „Silverlight für Windows Phone“ aus (siehe Abbildung 9. Da die App auf Silverlight basiert, konnte ich ohne Aufwand eine zweite Windows Phone-Anwendung für einen anderen Formfaktor generieren und so die oben beschriebene Web-App ergänzen. Das ging so einfach, da dieselben Techniken, die ich zum Binden der Silverlight-Clientsteuerelemente in XAML eingesetzt habe, auch für die Verbindung zu dem für die Web-App genutzten WCF-Dienst verwendet werden. Dadurch lässt sich der in Windows Azure gehostete Dienst sehr einfach wiederverwenden.

The Windows Phone Silverlight App Project Template
Abbildung 9: Die Projektvorlage für die Windows Phone-Silverlight-App

Die Windows Phone-App wurde von mir für die Konferenz mit allen Funktionen ausgestattet. Es war also möglich, alle registrierten Teilnehmer anzuzeigen, Berichte zu den Teilnehmern zu erstellen und per Facebook oder E-Mail in Kontakt zu treten. Um den Check-in zu ermöglichen, brauchte ich – im Gegensatz zu dem oben beschriebenen ASP.NET-Ansatz – asynchrone Methoden zum Ereignisrückruf, um sowohl die Daten von Windows Azure abzurufen, als auch um die Zeilen zu aktualisieren:

public MainViewModel() {
  this.Items = new ObservableCollection<ItemViewModel>();
  _sc = new Service1Client();
  // Same as earlier in the Silverlight PivotViewer app
  _sc.MyDataCompleted +=
    new EventHandler<MyDataCompletedEventArgs>(_sc_MyDataCompleted);
  // Used to update the row
  _sc.CheckInCompleted +=
    new EventHandler<CheckInCompletedEventArgs>(_sc_CheckInCompleted);
  // Get the data
  _sc.MyDataAsync(1);         
}

Diese Vorgehensweise ist, wie bereits gezeigt, die gleiche wie bei Windows-Silverlight-Apps. In diesem Fall jedoch habe ich die ViewModel-Klasse genutzt.

Als MainPage habe ich das ListBox-Steuerelement auf einer Windows Phone-Hochformatseite verwendet (siehe Abbildung 10). Diese wird geladen, wenn die App auf dem Windows Phone geladen wird (siehe Abbildung 11).

Bind Data to Silverlight in Windows Phone Apps in XAML the Same Way as in a Silverlight App
Abbildung 10: Datenbindung an Silverlight in Windows Phone-Apps in XAML wie bei einer Silverlight-App

Windows Phone App with Attendee List and Menu Button Navigation
Abbildung 11: Windows Phone-App mit Teilnehmerliste und Menüschaltflächen zur Navigation

Die Daten habe ich von der Windows Azure SQL-Datenbank abgerufen. Die ListBox aus dem ViewModel wurde mit Daten befüllt, indem jede einzelne Zeile durchlaufen wurde, die von meinem Windows Azure-WCF-Dienst mit den Abfrageergebnissen zurückgegeben wurde.

public void _sc_MyDataCompleted(object sender, MyDataCompletedEventArgs e)
{           
  for (int i = 0; i < e.Result.Count - 1; i++)
            {
  // Parse the incoming text for attendee name, e-mail address and company name
  string strMain = e.Result[i].ToString();
  string strName = strMain.Substring(0, strMain.IndexOf('(') - 1);
  string strEmail = strMain.Substring(
    strName.Length + 2, strMain.IndexOf(')')-strName.Length-2);
  string strCompany = strMain.Substring(strMain.IndexOf(':') + 2);
  this.Items.Add(new ItemViewModel()
    {LineOne=strName, LineTwo=strCompany, LineThree=strEmail });
}

Ein beliebtes Feature der Windows Phone-App, die ich für Konferenzen veröffentlich habe, ist die Bildanzeige. Zu Beginn dieses Artikels habe ich das Tool zum Hochladen von Bildern erwähnt, mit dem die Bilder abgerufen und im Windows Azure-BLOB-Speicher abgelegt wurden. Damit diese Bilder auch auf Windows Phone angezeigt werden konnten, habe ich einfach eine weitere Seite hinzugefügt (die Windows Phone-Navigation nutzt eine webbasierte Seitenstruktur). Die Navigation zu dieser Seite erfolgt über eine Menüschaltfläche am unteren Rand der Hauptseite (siehe Abbildung 11). Das lässt sich einfach umsetzen. Fügen Sie einfach dem Click-Ereignis einer Schaltfläche als Menüelement in etwa folgenden Code hinzu:

NavigationService.Navigate(new Uri("/PivotPage1.xaml", UriKind.Relative));

Für die Fotogalerieseite habe ich den Windows Phone-Seitentyp „Pivot“ (richtig, wieder dieses Wort „Pivot“) verwendet. Mit diesem Typ können die Benutzer bequem durch eine Liste blättern. Das Pivot-Steuerelement greift auf eine Liste mit PivotItems in XAML zu, mit denen dem Benutzer das flüssige horizontale Blättern ermöglicht wird. In meinem Fall musste ich nur einige Webbrowser-Steuerelemente als Foto 1, Foto 2, Foto 3 usw. hinzufügen (siehe Abbildung 12).

Abbildung 12: Hinzufügen von mehreren Webbrowser-Steuerelementen

<controls:Pivot Title="Microsoft Executive Technology Retreat">
  <controls:PivotItem Header="Photo 1">
    <Grid>
      <phone:WebBrowser HorizontalAlignment="Left" Margin="6,3,0,0"
        Name="MyWebBrowserControl" VerticalAlignment="Top" Height="605"
        Width="452" />
    </Grid>
  </controls:PivotItem>
  <controls:PivotItem Header="Photo2">
    <Grid>
      <phone:WebBrowser HorizontalAlignment="Left" Margin="6,3,0,0"
        Name="MyWebBrowserControl1" VerticalAlignment="Top" Height="605"
        Width="452" />
    </Grid>
  </controls:PivotItem>
...
  <controls:PivotItem Header="Photo10">
    <Grid>
      <phone:WebBrowser HorizontalAlignment="Left" Margin="6,3,0,0"
        Name="MyWebBrowserControl9" VerticalAlignment="Top" Height="605"
        Width="452" />
    </Grid>
  </controls:PivotItem>
</controls:Pivot>

Aufgrund der knappen Zeit und Ressourcen bei diesem Projekt habe ich mich auf einfache Lösungen besonnen. So zeigt das Windows Phone-Browser-Steuerelement für jedes Foto auf den URI für den Windows Azure-BLOB-Speicher. Dadurch können die Benutzer auch die Größe der Bilder verändern, was das Image-Steuerelement von Windows Phone nicht von sich aus bietet.

Auch der Code für den E-Mail-Abschnitt, damit sich die Teilnehmer gegenseitig E-Mails schreiben konnten, war einfach gehalten. Dafür wurde die integrierte EmailComposeTask-API von Windows Phone genutzt:

private void ApplicationBarEmailButton_Click(object sender, 
  EventArgs e)
{
  EmailComposeTask emailComposeTask = new EmailComposeTask();
  emailComposeTask.To = ContentText.Text;
  emailComposeTask.Body = "Hi There!";
  emailComposeTask.Subject = 
    "Microsoft Executive Technology Retreat";
  emailComposeTask.Show();
}

Die API greift auf die vorhandene Kontaktliste auf dem Telefon des Benutzers zu (siehe Abbildung 13).

The Windows Phone E-Mail Contact List
Abbildung 13: Die E-Mail-Kontaktliste von Windows Phone

Windows Azure SQL-Datenbank und Windows Azure SQL Reporting Services

Die Datenbank für meine schnell zusammengestellte Lösung hatte eine einfache Struktur. Durch den Einsatz der Windows Azure SQL-Datenbank konnte ich das Schema direkt in den klassischen lokalen SQL Server-Tools wie SQL Server Management Studio, SQL Server Data Tools und Business Intelligence Development Studio erstellen.

Einen Teil dieser Lösung haben wir noch nicht vollständig betrachtet: die Onlineregistrierung und -anmeldung, die über eine vorhandene, von Microsoft gehostete Lösung geregelt wurde. Interessanterweise hält unser Technologieunternehmen keine bereits fertig einsetzbare Lösung für die interaktive Nutzung der Teilnehmer vor Ort bereit. Deshalb erläutere ich Ihnen hier, wie das realisiert werden kann. Im Rahmen dieses Projekts wurde die Datenbank in der Windows Azure SQL-Datenbank über SQL Server Integration Services (SSIS) mit Daten befüllt (siehe Abbildung 14). Dieses einfache, unkomplizierte SSIS-Paket nimmt ein Excel-Abbild der registrierten Benutzer und ordnet es den Feldern in meinem Datenbankschema in der Windows Azure SQL-Datenbank zu. An dieser Stelle wird die „Abgeleitete Spalte“-Transformation eingesetzt, um Daten in solchen Feldern zu ändern, die möglicherweise nicht genau mit meinem Schema übereinstimmen. Bei einer Lösung wie dieser muss dieser Bereich wahrscheinlich etwas komplexer gestaltet werden, als ich es hier darstelle. Doch ich möchte Ihnen über diesen Artikel etwas vermitteln: und zwar, dass sich herkömmliche Tools wie SSIS perfekt in einer cloudbasierten Lösung wie dem vorgestellten Windows Azure-Veranstaltungssystem einsetzen lassen, sodass Sie nicht erst neue Tools erlernen müssen.

Using SQL Server Integration Services
Abbildung 14: Nutzen von SQL Server Integration Services

Wie Sie jetzt wissen, wird eine Lösung durch die derzeitigen Entwickler- und Datenverwaltungstools für Windows Azure zu einer Hybridlösung. Ein weiterer Bereich, der ebenfalls zeigt, dass sich Microsoft in Richtung Cloud Computing bewegt, ist Windows Azure SQL Reporting. Mit diesem Dienst habe ich aktuelle Berichte inklusive Zeitstempel und Kontaktdaten darüber erstellt, wer bei der Konferenz eingecheckt hat (siehe Abbildung 15). Dieses Format ist bereits bei allen bekannt, die schon einmal Berichte mit SQL Server Reporting Services (SSRS) erstellt haben. Im Grunde genommen handelt es sich bei Windows Azure SQL Reporting um SSRS in der Cloud, ausgeführt auf der Windows Azure-Plattform. Mir gefällt die Tatsache, dass Windows Azure SQL Reporting rein webbasiert ist und Silverlight nicht erforderlich ist. Schließlich bedeutete das für mich, dass ich denselben Bericht in Windows Phone rendern konnte und ich keinen neuen Bericht für die mobile App erstellen musste. Stattdessen habe ich den Bericht einfach über ein Webbrowser-Steuerelement referenziert:

 

webBrowser1.Navigate(new 
  Uri("https://fxnxxajmxx.reporting.windows.net/ReportServer?%2fAttendees&rs:
  Command=Render&rc:Toolbar=false", UriKind.Absolute));

Windows Azure SQL Reporting Was Used to Provide Reports on Attendee Check-Ins
Abbildung 15: Bereitstellen von Berichten zu den Teilnehmer-Check-ins mit Windows Azure SQL Reporting

Hier sehen Sie, dass der Webdienst für Windows Azure SQL Reporting mit einem lokalen SSRS-Dienst identisch ist. Das heißt, dass sich das Aussehen des Berichts über URL-Parameter verändern lässt. Abbildung 15 zeigt die Webseite, wie sie die freiwilligen Helfer am Check-in-Schalter auf ihren Laptops und Windows Phones zu sehen bekamen. Mithilfe des Berichts konnten die Helfer für jeden eintreffenden Teilnehmer das richtige Namensschild heraussuchen.

Das war so ziemlich alles. Es gab ein paar Unwägbarkeiten, da ich aus so vielen bereits vorhandenen Komponenten wie möglich schnell eine Lösung zusammenfügen musste, die sich schnell konfigurieren ließ und die nur eine minimale Infrastruktur erforderte. Das war also das ideale Projekt für den Einsatz von Cloud Computing. Indem ich Windows Azure für die Speicherung, das Hosting und die Webseiten eingesetzt habe, konnte ich mich auf ASP.NET, einen WCF-Dienst und eine Cloud-Datenbank mit Windows Azure SQL Reporting (das ich schon von einem früheren lokalen Projekt kannte) konzentrieren. Und da ich mich für die Benutzeroberflächen der Webseiten für Silverlight entschieden hatte, konnte ich dieselben Techniken schnell und unkompliziert für verschiedene Formfaktoren wiederverwenden.

Mark Kromer ist Spezialist für Microsoft SQL Server-Technologie in Philadelphia. Zuvor war er Produktmanager für Microsoft BI Solutions bei Microsoft und Oracle Corp. sowie Softwareentwickler und Datenbankberater bei AT&T und Agilent Technologies Inc.

Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: David Ateek