XING: https://www.xing.com/profile/Holger_SirtlLinkedIn: http://de.linkedin.com/in/hsirtl
Nach meinem ersten Video zu Windows Azure möchte ich meine Video-Reihe mit einem weiteren Azure Service fortsetzen: dem Windows Azure Access Control Service. Auch hier bin ich wieder unter der Zeitgrenze von 10 Minuten geblieben.
Hier das Video: Was ist der Windows Azure Access Control Service [09:54 Min.]
Aus meiner Sicht wird am Windows Azure Access Control Service (ACS) das Konzept von Platform-as-a-Service besonders schön deutlich. Mit dem ACS können eigene Anwendungen gezielt um Claims-basierte Zugriffskontrolle erweitert werden. Leicht können Authentifizierungsmechanismen wie Windows Live ID, Facebook ID, Google ID, Yahoo ID, Open ID und Active Directory Federation Services genutzt werden. Wie eine solche Anwendung aussehen kann, zeige ich in dem Video. Viel Spaß beim Schauen.
Weitere Informationen
Gerade habe ich eine Empfehlung zu einem Blog-Post bekommen, die ich gerne weiterleiten möchte:
Visual Guide to Azure Access Control Service Authentication with SharePoint 2010 von Wictor Wilén.
Darin beschreibt Wictor Wilén Schritt für Schritt die Konfiguration des Windows Azure Access Control Service zum Einsatz als Authentifizierungsmechanismus für SharePoint 2010. Die Schritte im einzelnen sind dabei:
In den nächsten Wochen möchte ich eine kleine Video-Reihe produzieren. Dabei werde ich auf verschiedene Aspekte rund um Cloud Computing und Windows Azure behandeln. Jedes Video soll dabei eine maximale Länge von 10 Minuten haben.
Und los geht’s mit einem ersten Video, in dem ich die Frage beantworte “Was ist Windows Azure?”. In knapp 10 Minuten erkläre ich darin, welche Dienste in Windows Azure vorhanden sind und wie sich die Ausführung eigener Cloud Services auf Azure gestaltet. Feedback natürlich willkommen.
Hier geht’s zum Video
Die Windows Azure Produktgruppe hat bekanntgegeben, dass ab sofort der SQL Azure Import/Export Service allgemein produktiv verfügbar ist. Mit diesem Dienst ist es sehr leicht möglich, bestehende lokal betriebene Datenbanken leicht in die Cloud auf SQL Azure zu bringen und existierende SQL Azure und SQL Server Datenbanken problemlos im Windows Azure Blob Storage zu archivieren.
Mit der Produktivsetzung des SQL Azure Import/Export Service werden auch einige Verbesserungen am Dienst verfügbar:
Der Dienst steht kostenlos zur Verfügung. Es fallen lediglich die üblichen Kosten für Datentransfer und Blob Storage (für die Ablage der archivierten Datenbanken) an.
Erstaunlicherweise gibt es für Windows Azure Blob Storage kaum leicht verdauliche Beispielanwendungen, die zeigen, wie man leicht auf diesen hoch-skalierbaren, hoch-verfügbaren Cloud Storage zugreifen kann. Diesem Mangel möchte ich mit diesem Blog-Artikel beseitigen.
In den folgenden Schritten soll eine kleine Beispielanwendung erstellt werden, mit deren Hilfe Dokumente in Blob Storage geschrieben, von dort ausgelesen, tabellarisch aufgelistet und auch wieder gelöscht werden können. Der Sourcecode der fertigen Solution steht unten zum Download zur Verfügung. Des weiteren können auch Videos, die ich beim Erstellen der Anwendung gedreht habe heruntergeladen werden:
Die Beispielanwendung geht davon aus, dass Sie ein Cloud Projekt wie in einem meinem letzten Blog-Posts beschrieben angelegt haben.
Öffnen Sie – durch Doppelklick auf die Web Role – die Konfigurationsseite der Web Role. Es erschein die in Abbildung 1 gezeigte Eingabemaske.
Abbildung 1: Konfiguration des Storage Accounts (Development Storage)
Geben sie in dieser Maske die in Tabelle 1 aufgelisteten Parameter ein und speichern Sie die WebRole.
Tabelle 1: Parameter für den Storage Account und die Tabelle
Öffnen Sie nun die Datei Global.asax.cs. Fügen Sie am Anfang der Datei Referenzen auf folgende Namespaces hinzu:
...
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;´
Damit machen Sie dem Programm Klassen zum Zugriff auf die Service-Konfiguration sowie den Windows Azure Storage zugänglich.
Erweitern Sie nun die Methode Application_Start wie im folgenden Listing angegeben.
void Application_Start(object sender, EventArgs e)
{
CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
});
var account =
CloudStorageAccount.FromConfigurationSetting("WAStorageConnectionString");
var container = account.CreateCloudBlobClient().GetContainerReference(
RoleEnvironment.GetConfigurationSettingValue("WAContainerName"));
container.CreateIfNotExist();
var permissions = container.GetPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Container;
container.SetPermissions(permissions);
}
Legen Sie im Hauptverzeichnis des Projekts einen Ordner Model an und fügen sie diesem eine neue Klassendatei Image.cs hinzu. Implementieren Sie die Klasse wie folgt:
namespace WebRole
public class Image
public string Title { get; set; }
public string FileName { get; set; }
public string Description { get; set; }
public string Tags { get; set; }
public string ImageUri { get; set; }
public long Size { get; set; }
Über diese Klasse werden später Blob-Objekte instanziiert und dient als Basis für die Datenquelle, die über die Oberfläche für die Blob-Zugriffe angesprochen wird. Sie definiert die für Blobs benötigten Attribute.
Legen Sie mit der Klasse ImageDataSource nun die entsprechende Datenquelle an und implementieren Sie die Klasse wie folgt:
using System;
using System.Collections.Generic;
using Microsoft.WindowsAzure.StorageClient;
using System.Collections.Specialized;
public class ImageDataSource
private CloudBlobContainer container = null;
public ImageDataSource()
var client = account.CreateCloudBlobClient();
container = client.GetContainerReference(
public Uri Insert(string title, string description, string tags,
string fileName, string contentType, byte[] data)
var blob = container.GetBlobReference(fileName);
blob.Properties.ContentType = contentType;
var metadata = new NameValueCollection();
metadata["FileName"] = fileName;
metadata["ImageTitle"] = title;
metadata["Description"] = description;
metadata["Tags"] = tags;
blob.Metadata.Add(metadata);
blob.UploadByteArray(data);
return blob.Uri;
public IEnumerable<Image> Select()
var imageList = new List<Image>();
var blobList = container.ListBlobs(new BlobRequestOptions());
foreach (CloudBlob blob in blobList)
blob.FetchAttributes();
var image = new Image()
ImageUri = blob.Uri.ToString(),
Title = blob.Metadata.Get("ImageTitle"),
FileName = blob.Metadata.Get("FileName"),
Description = blob.Metadata.Get("Description"),
Tags = blob.Metadata.Get("Tags"),
Size = blob.Properties.Length
};
imageList.Add(image);
return imageList;
public void Delete(string ImageUri)
var blob = container.GetBlobReference(ImageUri);
blob.DeleteIfExists();
Die Klasse stellt also alle Methoden bereit, die zum Auslesen, Hinzufügen und Löschen von Blobs benötigt werden. Kompilieren Sie nun das Projekt. Dies ist wichtig, da andernfalls die Klasse später nicht Auswahl als Datenquelle für den GridView angeboten wird.
Öffnen Sie nun die Datei Default.aspx. Fügen Sie der Datei ein GridView hinzu, indem sie ein entsprechendes Element aus der Toolbox auf die Datei ziehen. Die Datei sollte dann wie in Abbildung 2 gezeigt aussehen.
Abbildung 2: Hinzufügen eines GridView-Controls und Auswahl der Datenquelle
Bestimmen Sie nun im Kontextmenü des GridViews (zu sehen in Abbildung 2) die Datenquelle. Wählen Sie den Menüpunkt Choose Data Source / New data source. Es erscheint die in Abbildung 3 gezeigte Eingabemaske.
Abbildung 3: Auswahl einer ObjectDataSource
Wählen Sie hier als Datenquelle Object und benennen die Datenquelle mit ObjectDataSource. Bestätigen Sie Ihre Eingabe mit OK. Es erscheint die in Abbildung 4 gezeigte Eingabemaske.
Abbildung 4: Auswahl des Business Objekts
Wählen Sie hier als Business-Objekt die Klasse WebRole.ImageDataSource und bestätigen Sie Ihre Eingabe mit Next.
Abbildung 5: Auswahl der Business Methoden für Auswahl und Löschen
Bestimmen Sie nun die Methoden für die einzelnen Datenoperationen, d.h. für die Operation Select die Methode Select(), für Insert die Methode Insert() usw. Schließen Sie Ihre Eingabe mit Finish ab. Mit diesen Eingaben stehen dem GridView alle Informationen für die Anzeige der Kontaktdaten zur Verfügung. Wenn Sie im Kontextmenü des GridViews auch noch die Option EnableDeleting aus.
Legen Sie im Code des GridView das Schlüsselattribut für einzelne Image-Objekte, ImageUri wie folgt fest:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:GridView
ID="GridView1"
runat="server"
AutoGenerateColumns="False"
DataSourceID="ObjectDataSource"
DataKeyNames="ImageUri">
Konfigurieren Sie die Spalten des GridView wie folgt.
<Columns>
<asp:HyperLinkField DataNavigateUrlFields="ImageUri" DataTextField="FileName"
HeaderText="Filename" />
<asp:BoundField DataField="Title" HeaderText="Title"
SortExpression="Title" />
<asp:BoundField DataField="Description" HeaderText="Description"
SortExpression="Description" />
<asp:BoundField DataField="Tags" HeaderText="Tags" SortExpression="Tags" />
<asp:BoundField DataField="Size" HeaderText="Size" SortExpression="Size" />
<asp:CommandField ShowDeleteButton="true" />
</Columns>
Damit verlinken Sie beispielsweise den Namen des Blobs in der Spalte Filename mit dem eigentlichen Blob-Inhalt. Wenn sie also auf den Namen des Bildes klicken, wird das Bild selbst angezeigt.
Konfigurieren Sie nun noch das Eingabeformular zum Upload von Blobs wie im folgenden Listing angegeben.
</asp:ObjectDataSource>
<br />
<asp:Label ID="filePathLabel" Text="File Path:" runat="server" />
<asp:FileUpload ID="imageFile" runat="server" />
<asp:Label ID="imageTitleLabel" Text="Image Title:" runat="server" />
<asp:TextBox ID="imageTitle" runat="server" />
<asp:Label ID="imageDescriptionLabel" Text="Image Description:" runat="server" />
<asp:TextBox ID="imageDescription" runat="server" />
<asp:Label ID="imageTagsLabel" Text="Image Tags:" runat="server" />
<asp:TextBox ID="imageTags" runat="server" />
<asp:Button ID="insertButton" Text="Submit" runat="server"
OnClick="insertButton_Click" />
</asp:Content>
Damit ist die Programmierung der Oberfläche abgeschlossen. Es fehlt noch die Logik für die Default.aspx.cs. Implementieren Sie diese wie im folgenden Listing angegeben:
public partial class _Default : System.Web.UI.Page
private ImageDataSource dataSource = null;
protected void Page_Load(object sender, EventArgs e)
dataSource = new ImageDataSource();
protected void insertButton_Click(object sender, EventArgs e)
if (imageFile.HasFile)
dataSource.Insert(
imageTitle.Text,
imageDescription.Text,
imageTags.Text,
imageFile.FileName,
imageFile.PostedFile.ContentType,
imageFile.FileBytes
);
GridView1.DataBind();
Starten Sie einen Testlauf, indem Sie den Menüpunkt Debug / Start Debugging auswählen. Nach einem kurzen Moment sollte die Startseite wie in Abbildung 6 zu sehen angezeigt werden.
Abbildung 6: Erstmalige Ausführung der Blob Storage Anwendung
Da im Container noch keine Blobs liegen, wird nur das Eingabeformular, nicht jedoch das Grid angezeigt. Wählen Sie über den Button Browse eine Datei aus und vergeben Sie Titel, Beschreibung und Tags. Bestätigen Sie Ihre eingabe mit Submit. Nach erfolgreichem Upload sollte die GridView mit dem Blobeintrag wie in Abbildung 7 zu sehen angezeigt werden.
Abbildung 7: Anwendung, nachdem ein Bild hinzugefügt wurde
Die Microsoft Interoperability Group hat überarbeitete Libraries für Java veröffentlicht. Diese ermöglichen unter anderem auch den Zugriff auf die REST API, die vom Windows Azure Service Bus bereitgestellt wird.
Die Windows Azure Libraries für Java können von GitHub heruntergeladen werden. Weitere Informationen finden sich im Windows Azure Java Developer Center.
Auf MSDN finden sich für Java Entwickler darüber hinaus eine Reihe weiterer Artikel zur Verwendung der verschiedenen Azure Cloud-Services:
Für alle, die bislang an einer Migration in die Cloud interessiert waren, gab es nur den SQL Azure Migration Wizard, der Aufschluss darüber gab, ob die Migration einer SQL Server Datenbank nach SQL Azure möglich war bzw. welche Änderungen erforderlich waren.
Seit dem 03. Januar 2012 steht nun ein neuer Online-Service bereit, der Reports zu geplanten Migrationsvorhaben geben kann: SQL Azure Compatibility Assessment. Dieser stellt Informationen zusammen, die wichtig für die Migration einer SQL Server Datenbank nach SQL Azure sind. Die Bedienung ist sehr leicht.
Benötigt werden:
Kenntnisse zu Azure sind darüber hinaus nicht erforderlich. Ergebnis eines Assessments ist ein Report, der alle Datenobjekte auflistet, die in SQL Azure nicht unterstützt werde bzw. Objekte, die für die Migration geändert werden müssen. Hier eine Beispielausgabe:
Eine .dacpac-Datei kann mit Hilfe der SQL Server Data Tools erstellt werden. Diese kann im Assessment-Portal hochgeladen werden. Das Portal gibt dann einen Überblick über alle Schema-Objekte, die in SQL Azure nicht unterstützt werden bzw. überarbeitet werden müssen.
Termin und Ort für das Windows Azure Bootcamp “Extend SharePoint” stehen nun fest:
Am 13.03.2012 von 09:00Uhr bis 17:00Uhr dreht sich alles um die Kombination von SharePoint und Azure. Auf der Agenda stehen folgende Punkte:
Weitere Informationen und Möglichkeit zur Anmeldung gibt es hier:
Eine Übersicht über alle Windows Azure Camps (also auch zu anderen Themen) gibt es hier.
Erstaunlicherweise gibt es für Windows Azure Table Storage kaum leicht verdauliche Beispielanwendungen, die zeigen, wie man leicht auf diesen hoch-skalierbaren, hoch-verfügbaren Cloud Storage zugreifen kann. Diesem Mangel möchte ich mit diesem Blog-Artikel beseitigen.
In den folgenden Schritten soll eine kleine Beispielanwendung erstellt werden, mit deren Hilfe Einträge in Table Storage geschrieben, von dort ausgelesen, angezeigt und auch wieder gelöscht werden können. Der Sourcecode der fertigen Solution steht unten zum Download zur Verfügung. Des weiteren können auch Videos, die ich beim Erstellen der Anwendung gedreht habe heruntergeladen werden:
Die Beispielanwendung geht davon aus, dass Sie ein Cloud Projekt wie in meinem letzten Blog-Post beschrieben angelegt haben. In einem Ersten Schritt müssen in diesem Projekt die Zugriffsinformationen für den Storage, d.h. die Account-Informationen und der Name der Tabelle hinterlegt werden. Klicken Sie hierzu im Solution Explorer doppelt auf die WebRole im Konfigurationsprojekt. Es erschein die in Abbildung 1 gezeigte Eingabemaske.
WAStorageConnectionString
UseDevelopmentStorage=true
Definiert den zu verwendenden Storage Account. Für Testzwecke kann auch (wie hier) der Development Storage verwendet werden.
WATableName
DemoTable
Name der Tabelle im Table Storage
Fügen Sie nun noch eine Referenz zur Assembly System.Data.Service.Client dem Projekt hinzu. Klicken Sie hierzu mit der rechten Maustaste auf das WebRole-Projekt und wählen den Menüpunkt Add Reference. Es erscheint die in Abbildung 2‑4 gezeigte Eingabemaske.
Abbildung 2: Hinzufügen der Referenz auf die Assembly System.Data.Services.Client
Wählen Sie die Assembly System.Data.Services.Client aus und bestätigen Sie Ihre Auswahl mit OK.
... using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; using Microsoft.WindowsAzure.ServiceRuntime; ...
Erweitern Sie nun die Methode Application_Start() wie im folgenden Listing angegeben.
void Application_Start(object sender, EventArgs e) { CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) => { configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)); }); var account = CloudStorageAccount.FromConfigurationSetting("WAStorageConnectionString"); var tableName = RoleEnvironment.GetConfigurationSettingValue("WATableName"); account.CreateCloudTableClient().CreateTableIfNotExist(tableName); }
var tableName = RoleEnvironment.GetConfigurationSettingValue("WATableName");
account.CreateCloudTableClient().CreateTableIfNotExist(tableName);
Erstellen Sie nun eine Klasse Klasse Contact.cs. Diese beschreibt letztlich den Aufbau der Einträge in der Table. Implementieren Sie diese Klasse wie folgt:
using System; using Microsoft.WindowsAzure.StorageClient; namespace WebRole { public class Contact : TableServiceEntity { public Contact(string partitionKey, string rowKey) : base(partitionKey, rowKey) { } public Contact() { PartitionKey = "ABC"; RowKey = string.Format("{0:10}_{1}", DateTime.Now.Ticks, Guid.NewGuid()); } public string Name { get; set; } public string Vorname { get; set; } public string Email { get; set; } } }
public class Contact : TableServiceEntity
public Contact(string partitionKey, string rowKey)
: base(partitionKey, rowKey)
public Contact()
PartitionKey = "ABC";
RowKey = string.Format("{0:10}_{1}", DateTime.Now.Ticks, Guid.NewGuid());
public string Name { get; set; }
public string Vorname { get; set; }
public string Email { get; set; }
In jeder Tabellenzeile warden demnach Name, Vorname und E-Mail-Adresse der Kontakte abgelegt. Hinzu kommen die Pflicht-Propertyes PartitionKey und RowKey. Der PartitionKey wird hier mit einem festen Wert belegt. Damit hält Windows Azure alle Einträge der Tabelle in einer einzigen Partition. Für dieses Beispiel ist dies vertretbar, bei größeren Datenbeständen sollte der PartitionKey jedoch so belegt werden, dass Windows Azure die einzelnen Einträge sinnvoll auf Partitionen aufteilen kann.
Legen Sie jetzt eine Klasse ContactDataServiceContext.cs an und implementieren Sie diese wie folgt:
using System.Linq; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.ServiceRuntime; using Microsoft.WindowsAzure.StorageClient; namespace WebRole { public class ContactDataServiceContext : TableServiceContext { internal string ContactTableName = RoleEnvironment.GetConfigurationSettingValue("WATableName"); internal ContactDataServiceContext(string baseAddress, StorageCredentials credentials) : base(baseAddress, credentials) { } public IQueryable<Contact> Contacts { get { return this.CreateQuery<Contact>(ContactTableName); } } } }
using System.Linq;
public class ContactDataServiceContext : TableServiceContext
internal string ContactTableName =
RoleEnvironment.GetConfigurationSettingValue("WATableName");
internal ContactDataServiceContext(string baseAddress,
StorageCredentials credentials)
: base(baseAddress, credentials)
public IQueryable<Contact> Contacts
get
return this.CreateQuery<Contact>(ContactTableName);
Über die Property Contacts ermöglicht diese Klasse, die von TableServiceContext abgeleitet ist, den Zugriff auf den Table Storage. Die Speicherung der Kontaktdaten erfolgt in der über die Service-Konfiguration bestimmten Tabelle.
Die letzte Klasse, die benötigt wird, ist ContactDataSource.cs. Fügen Sie diese dem Projekt hinzu und implementieren Sie sie wie folgt:
using System; using System.Collections.Generic; using System.Linq; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; namespace WebRole { public class ContactDataSource { private ContactDataServiceContext context = null; public ContactDataSource() { var account = CloudStorageAccount.FromConfigurationSetting("WAStorageConnectionString"); context = new ContactDataServiceContext(account.TableEndpoint.ToString(), account.Credentials); context.RetryPolicy = RetryPolicies.Retry(3, TimeSpan.FromSeconds(1)); } public IEnumerable<Contact> Select() { var results = from c in context.Contacts select c; var query = results.AsTableServiceQuery<Contact>(); var queryResults = query.Execute(); return queryResults; } public Contact GetContactById(string PartitionKey, string RowKey) { return context.Contacts.Where(c => ((c.RowKey == RowKey) && (c.PartitionKey == PartitionKey))).First(); } public void Delete(Contact contact) { Contact item = GetContactById(contact.PartitionKey, contact.RowKey); context.DeleteObject(item); context.SaveChanges(); } public void Insert(Contact contact) { context.AddObject(context.ContactTableName, contact); context.SaveChanges(); } } }
public class ContactDataSource
private ContactDataServiceContext context = null;
public ContactDataSource()
context = new ContactDataServiceContext(account.TableEndpoint.ToString(),
account.Credentials);
context.RetryPolicy = RetryPolicies.Retry(3, TimeSpan.FromSeconds(1));
public IEnumerable<Contact> Select()
var results = from c in context.Contacts
select c;
var query = results.AsTableServiceQuery<Contact>();
var queryResults = query.Execute();
return queryResults;
public Contact GetContactById(string PartitionKey, string RowKey)
return context.Contacts.Where(c => ((c.RowKey == RowKey) &&
(c.PartitionKey == PartitionKey))).First();
public void Delete(Contact contact)
Contact item = GetContactById(contact.PartitionKey, contact.RowKey);
context.DeleteObject(item);
context.SaveChanges();
public void Insert(Contact contact)
context.AddObject(context.ContactTableName, contact);
Die Klasse stellt also alle Methoden bereit, die zum Auslesen, Hinzufügen, Ändern und Löschen von Kontakten benötigt werden. Kompilieren Sie nun das Projekt. Dies ist wichtig, da andernfalls die Klasse später nicht Auswahl als Datenquelle für den GridView angeboten wird.
Öffnen Sie nun die Datei Default.aspx. Fügen Sie der Datei ein GridView hinzu, indem sie ein entsprechendes Element aus der Toolbox auf die Datei ziehen. Die Datei sollte dann wie in Abbildung 3 gezeigt aussehen.
Abbildung 3: Hinzufügen eines GridView-Controls und Auswahl der Datenquelle
Bestimmen Sie nun im Kontextmenü des GridViews (zu sehen in Abbildung 3) die Datenquelle. Wählen Sie den Menüpunkt Choose Data Source / New data source. Es erscheint die in Abbildung 4 gezeigte Eingabemaske.
Abbildung 4: Auswahl einer ObjectDataSource
Wählen Sie hier als Datenquelle Object und benennen die Datenquelle mit ObjectDataSource. Bestätigen Sie Ihre Eingabe mit OK. Es erscheint die in Abbildung 5 gezeigte Eingabemaske.
Abbildung 5: Auswahl des Business Objekts
Wählen Sie hier als Business-Objekt die Klasse WebRole.ContactDataSource und bestätigen Sie Ihre Eingabe mit Next.
Abbildung 6: Auswahl der Business Methoden für Auswahl, Einfügen und Löschen
Bestimmen Sie nun die Methoden für die einzelnen Datenoperationen, d.h. für die Operation Select die Methode Select(), für Insert die Methode Insert() usw. Schließen Sie Ihre Eingabe mit Finish ab. Mit diesen Eingaben stehen dem GridView alle Informationen für die Anzeige der Kontaktdaten zur Verfügung. Wenn Sie im Kontextmenü des GridViews noch die Option EnableDeleting auswählen, sollte der Zwischenstand wie in Abbildung 7 gezeigt aussehen.
Abbildung 7: Zwischenstand nach dem Einfügen der GridView
Nun wird noch eine Möglichkeit benötigt, um neue Kontakte anzulegen. Fügen Sie hierzu eine FormView in die Seite ein, indem Sie ein entsprechendes Element aus der Toolbox auf die Seite Default.aspx ziehen, und wählen Sie die gleiche Datenquelle wie beim GridView. Bearbeiten Sie im FormView nun das InsertItemTemplate. Wählen sie im Kontextmenü des FormViews den Eintrag Edit Templates und wählen das InsertItemTemplate. Löschen Sie aus der Ansicht nun die automatisch generierten Eingabefelder für PartitionKey, RowKey und Timestamp. Diese sollen ja später nicht vom Benutzer eingegeben sondern vom System erzeugt werden. Damit sollte das FormView wie in Abbildung 8 gezeigt aussehen.
Abbildung 8: Entfernung von Attributen aus dem InsertItemTemplate
Nun sind noch ein paar Änderungen im Code der Default.aspx erforderlich. Wechseln sie hierzu in die Code-Ansicht der Seite. Setzen Sie zunächst im GridView die Schlüsselattribute für die Kontakte. Ergänzen Sie das GridView-Element wie folgt.
... <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" DataSourceID="ObjectDataSource" ForeColor="#333333" GridLines="None" DataKeyNames="PartitionKey,RowKey"> ...
CellPadding="4"
ForeColor="#333333"
GridLines="None"
DataKeyNames="PartitionKey,RowKey">
PartitionKey und RowKey bilden zusammen den Primärschlüssel eines Kontakt-Eintrags. Diese Angabe ist erforderlich, damit bei Auswahl der vollständige Schlüssel übergeben werden kann.
Setzen Sie nun noch wie folgt den Eingabemodus als Standard für die Anzeige der FormView.
... <asp:FormView ID="FormView1" runat="server" DataSourceID="ObjectDataSource" DefaultMode="Insert"> ...
<asp:FormView
ID="FormView1"
DefaultMode="Insert">
Der Code der Datei Default.aspx sollte nun in etwa wie folgt aussehen.
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebRole._Default" %> <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> </asp:Content> <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" DataSourceID="ObjectDataSource" ForeColor="#333333" GridLines="None" DataKeyNames="PartitionKey,RowKey"> <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> <Columns> <asp:CommandField ShowDeleteButton="True" /> <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> <asp:BoundField DataField="Vorname" HeaderText="Vorname" SortExpression="Vorname" /> <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" /> <asp:BoundField DataField="Timestamp" HeaderText="Timestamp" SortExpression="Timestamp" /> <asp:BoundField DataField="PartitionKey" HeaderText="PartitionKey" SortExpression="PartitionKey" /> <asp:BoundField DataField="RowKey" HeaderText="RowKey" SortExpression="RowKey" /> </Columns> <EditRowStyle BackColor="#999999" /> <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> <SortedAscendingCellStyle BackColor="#E9E7E2" /> <SortedAscendingHeaderStyle BackColor="#506C8C" /> <SortedDescendingCellStyle BackColor="#FFFDF8" /> <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> </asp:GridView> <asp:FormView ID="FormView1" runat="server" DataSourceID="ObjectDataSource" DefaultMode="Insert"> <InsertItemTemplate> Name: <asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>' /> <br /> Vorname: <asp:TextBox ID="VornameTextBox" runat="server" Text='<%# Bind("Vorname") %>' /> <br /> Email: <asp:TextBox ID="EmailTextBox" runat="server" Text='<%# Bind("Email") %>' /> <br /> <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Insert" /> </InsertItemTemplate> </asp:FormView> <asp:ObjectDataSource ID="ObjectDataSource" runat="server" DataObjectTypeName="WebRole.Contact" DeleteMethod="Delete" InsertMethod="Insert" SelectMethod="Select" TypeName="WebRole.ContactDataSource"></asp:ObjectDataSource> </asp:Content>
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="WebRole._Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<asp:CommandField ShowDeleteButton="True" />
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="Vorname" HeaderText="Vorname"
SortExpression="Vorname" />
<asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
<asp:BoundField DataField="Timestamp" HeaderText="Timestamp"
SortExpression="Timestamp" />
<asp:BoundField DataField="PartitionKey" HeaderText="PartitionKey"
SortExpression="PartitionKey" />
<asp:BoundField DataField="RowKey" HeaderText="RowKey"
SortExpression="RowKey" />
<EditRowStyle BackColor="#999999" />
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#E9E7E2" />
<SortedAscendingHeaderStyle BackColor="#506C8C" />
<SortedDescendingCellStyle BackColor="#FFFDF8" />
<SortedDescendingHeaderStyle BackColor="#6F8DAE" />
</asp:GridView>
<InsertItemTemplate>
Name:
<asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>' />
Vorname:
<asp:TextBox ID="VornameTextBox" runat="server" Text='<%# Bind("Vorname") %>' />
Email:
<asp:TextBox ID="EmailTextBox" runat="server" Text='<%# Bind("Email") %>' />
<asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True"
CommandName="Insert" Text="Insert" />
</InsertItemTemplate>
</asp:FormView>
<asp:ObjectDataSource ID="ObjectDataSource" runat="server"
DataObjectTypeName="WebRole.Contact" DeleteMethod="Delete"
InsertMethod="Insert" SelectMethod="Select"
TypeName="WebRole.ContactDataSource"></asp:ObjectDataSource>
Damit ist die Anwendung fertig. Starten Sie einen Testlauf, indem Sie den Menüpunkt Debug / Start Debugging auswählen. Nach einem kurzen Moment sollte die Startseite wie in Abbildung 9 zu sehen angezeigt werden.
Abbildung 9: Erstmalige Ausführung der Table Storage Anwendung
Da in der Tabelle noch keine Einträge vorhanden sind, wird die Tabelle nicht angezeigt. Es erscheint nur die Eingabemaske. Tragen Sie in diese einen Eintrag ein und bestätigen Sie Ihre Eingabe mit Insert. Anschließend sollte auch die GridView mit dem Tabelleneintrag wie in Abbildung 10 zu sehen angezeigt werden.
Abbildung 10: Table Storage Anwendung, nachdem ein Eintrag eingefügt wurde
Für einige meiner Windows Azure Demos benötige ich immer wieder einen minimalen Cloud Service, der ohne Schnickschnack auskommt, und der einen Blick auf das Wesentliche der Anwendung ermöglicht. Ich möchte kurz beschreiben, wie ein solcher minimaler Cloud Service aussehen kann, und werde auf diesen Blog-Eintrag von folgenden Einträgen verweisen.
Ich habe von der Erstellung einer solchen Anwendung auch ein Video erstellt, welches hier heruntergeladen werden kann.
Öffnen Sie zunächst Visual Studio als Administrator. Admin-Berechtigung ist später für das Ausführen im Compute Emulator erforderlich. Legen Sie über den Menüpunkt File / New / Project ein neues Projekt an. Es erscheint die Dialogbox aus Abbildung 1.
Abbildung 1: Anlegen eines neuen Cloud Service
Wählen Sie als Projektvorlage Cloud / Windows Azure Projekt und fügen Sie in folgender Eingabemaske dem Service eine neuen Web Role hinzu.
Abbildung 2: Hinzufügen einer Web Role
Visual Studio legt nun eine neue Solution an, in die die für den Cloud Service benötigten Elemente (ein Projekt für die Cloud Service Konfiguration und ein Projekt für die Web Role) hinzugefügt werden. Leider fügt Visual Studio auch einige Elemente hinzu, die eigentlich nicht benötigt werden bzw. zum Teil sogar dazu führen, dass der generierte Service zwar lokal im Compute Emulator, nicht aber ohne zusätzliche Konfiguration auf Windows Azure ausführbar ist. So finden sich in der Web.config beispielsweise Referenzen auf eine SqlExpress-Installation, die zwar lokal vorhanden ist, nicht aber in der Cloud, wo dieser Umstand beim Start der Anwendung zu einer Exception führt.
Im Folgenden werden nun diese Elemente aus dem Cloud Service entfernt. Löschen Sie zunächst überflüssige Inhalte aus dem <asp:Content>-Element der Datei Default.aspx wie folgt:
... <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> </asp:Content> ...
Löschen Sie nun auch überflüssige Inhalte aus der Datei site.master:
... <div class="header"> <div class="title"> <h1> My ASP.NET Application </h1> </div> <div class="clear hideSkiplink"> </div> </div> ...
<div class="header">
<div class="title">
<h1>
My ASP.NET Application
</h1>
</div>
<div class="clear hideSkiplink">
Abschließend löschen Sie nun auch überflüssige Inhalte aus der web.config:
... <configuration> <system.diagnostics> ... </system.diagnostics> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true" /> </system.webServer> </configuration> ...
<configuration>
<system.diagnostics>
</system.diagnostics>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
Nun können Sie über den Menüpunkt Debug / Start Debugging einen Testlauf starten, der Ihnen dann folgende Oberfläche zeigen sollte
Damit ist die Erstellung der minimalen Cloud-Anwendung abgeschlossen.
Seit gestern ist das Dezember Update von Windows Azure produktiv. Dieses Update wartet mit einer Reihe wirklich toller Neuerungen auf, die ich im folgenden Zusammenfassen möchte:
Vereinfachtes Testangebot (mit Kostendeckelung)
In nur 3 einfachen Schritten können Sie sich jetzt schneller den je für Ihr kostenloses Trial Angebot anmelden. Und mit der neuen Kostenkontrolle dabei sicher gehen dass Sie niemals mehr als Ihr kostenloses inklusiv Kontingent nutzen.
Verbesserte Abonnementverwaltung und Echtzeit-Einblick des Verbrauchs
Mit der verbesserten Abonnement Verwaltung können Sie jetzt zwischen Windows Azure Preispaketen wechseln oder dabei neue Abonnements anlegen zu müssen. Bestehende Abonnements können jetzt direkt über das Windows Azure Management Portal gelöscht werden und dort erhalten Sie auch minutengenauen Einblick in Ihren aktuellen Verbrauch.
Neues SQL Azure Management Portal
Ganz im Metro Stil gehalten vereinfacht das neue Portal das überwachen der SQL Azure Datenbanken, und ermöglicht einen detaillierten Einblick in Schemata, Query Pläne, Indizes und Performance Statistiken.
Erhöhte Maximalgröße von SQL Azure Datenbanken
Die maximale Datenbankgröße einer SQL Azure Datenbank wurde nun von 50 auf 150 GB erhöht um den wachsenden Anforderungen nach mehr Speicherplatz zu genügen. Und während die Datenbankgröße steigt, bleibt der Preis für eine Datenbank der gleiche. Egal ob 50GB oder 150GB, der maximale Preis für eine SQL Azure Datenbank beträgt $ 499.95.Das bedeutet bei Nutzung einer 150GB Datenbank einen effektiven Preisnachlass von 67%.
Verfügbarkeit von SQL Azure Federations
Mit den neuen SQL Azure Federation Services skalieren Sie Ihre Datenbanken dank einer neuen Verteilungstechnik noch einfacher und effizienter. Ihre Datenbank skaliert grenzenlos anhand der Anforderungen Ihrer Applikation und ist dabei voll Mandantenfähigkeit.
ISO 27001 Zertifizierung der Windows Azure Kerndienste
Seit dem 29. November sind nun auch die Kerndienste von Windows Azure ISO/IEC 27001:2005 durch die BSI Gruppe zertifiziert und auf der Webseite einzusehen.
Windows Azure SDK für Node.js
Windows Azure ist schon seit Beginn offen für viele Sprachen wie PHP, Ruby und selbstverständlich auch .NET. Seit dem Dezember Release wird nun auch Node.js unterstützt. Ab sofort ist ein eigenes Windows Azure SDK für Node.js verfügbar. Die Bibliotheken enthalten Möglichkeiten um auf Windows Azure Speicher zuzugreifen, egal ob als Blob, Tabelle oder Queue. Um den Start mit Node.js für Azure so einfach wie möglich zu machen wurden spezifische Tutorials, Beispiele und Templates auf http://www.microsoft.com/windowsazure bereitgestellt. Weitere Informationen hierzu im Windows Azure Node.js Developer Center.
Limitierte Community Technology Preview der Apache Hadoop Distribution für Windows Azure
Um die neuen Big Data Funktionalitäten auf Windows Azure zu unterstützen wurde eine limitierte CTP für Windows Azure Apache Hadoop veröffentlicht. Dieses Preview ermöglicht es einfach und schnell Hadoop Projekte auf Windows Azure zu betreiben. Da diese Preview nur einer begrenzten Zahl an Benutzern zu Verfügung steht müssen Sie sich dafür über diesen Link registrieren.
Neue Werkzeuge für Open-Source-Technologien
Folgende Neuerungen gibt es für Entwickler, die Eclipse, Java, MongoDB, Solr/Lucene oder Memcached verwenden:
Neues Branding
Ab sofort werden im Rahmen von Azure nur noch die Marken Windows Azure und SQL Azure verwendet. Cloud Services, die bislang unter der Marke AppFabric liefen, werden ab jetzt unter der Marke Windows Azure geführt (also z.B. “Windows Azure Service Bus”)
Am 13.12.2011 findet in Redmond ein Training-Event zum Thema “Learn Windows Azure” statt. Die gute Nachricht für alle, die sich an diesem Dienstag nicht in Redmond aufhalten: das Gaze wird vollständig auf Channel 9 gestreamt und ist somit allen Interessierten zugänglich.
Sprecher werden sein (unter anderem):
Also sehr prominent besetzt.Teilnahme ist kostenlos. Die Agenda sieht wie folgt aus (Vortragszeiten hier in deutscher Zeit):
Anmeldemöglichkeit besteht unter folgendem Link: http://www.learnwindowsazureevent.com/
Für alle Spiele-Entwickler, die sich bisher noch nicht an das Windows Azure Toolkit für Social Games gewagt haben, da dieses bisher recht stark mit der Demo-Anwendung Tankster verwoben war (sprich: Spiel und Framework waren nicht ausreichend voneinander getrennt), gibt es jetzt eine sehr gute Nachricht: das Windows Azure Toolkit für Social Games ist in Version 1.1 erschienen.
Die erste Version Des Toolkits fokussierte sehr stark auf die Beispielanwendung Tankster, d.h. Framework und Beispielanwendung waren sehr eng miteinander verzahnt. In Version 1.1 sind diese beiden Elemente voneinander getrennt. Damit wird es deutlich leichter möglich, sich in das Social Gaming Framework einzuarbeiten.
Kernfunktionalitäten des Toolkits sind:
Die Windows Azure Produktgruppe hat heute Nacht einige Neuerungen für Windows Azure Entwickler bereitgestellt. Die Highlights sind:
Das Windows Azure SDK (und die Tools für Visual Studio) enthält unter anderem folgende Neuerungen:
In dieser Ausgabe von Channel 9 zeigt mein Kollege Wade Wegner, wie in weniger als 2 Minuten mit Hilfe dreier NuGet Packages ein neues Windows Phone 7.1 Projekt erstellt werden kann, das Push Notifications nutzen kann, die in einer auf Windows Azure betriebenen ASP.NET MVC 3 Anwendung erzeugt werden.
Zur Implementierung werden die folgenden NuGet-Packages benötigt:
Heute möchte ich auf eine kleine, aber sehr coole Anwendung hinweisen, die meine Kollegen aus Redmond (unter anderem Wade Wegener) auf Codeplex veröffentlicht haben: BlobShare. Mit dieser Anwendung ist es möglich, auf sichere Art und Weise Dokumente über Windows Azure Blob Storage auszutauschen. Dabei werden Zugriffe über den Access Control Service abgesichert, d.h. nur vorher von einem Administrator konfigurierte Benutzer können sich nach einer entsprechenden Authentifizierung anmelden, um Dokumente hochzuladen, zu ändern oder abzurufen. Dabei werden verschiedene Authentifizierungsmechanismen unterstützt. Benutzer können ihnen vertraute Dienste wie Windows Live ID, Facebook ID, Google ID oder auch Active Directory zur Authentifizierung nutzen.
Die Architektur stellt sich wie folgt dar:
Die Nutzung gestaltet sich demnach wie folgt:
Zur Nutzung in eigenen Szenarien wird ein Windows Azure Account benötigt. Für einen temporären Einsatz empfiehlt sich der kostenfreie Azurepass. Dieser erlaubt eine kostenfreie, unverbindliche Nutzung von Azure über einen Zeitraum von 30 Tagen.
In der neuesten Ausgabe von Channel 9 gibt Christian Liensberger, Program Manager für den Windows Azure Marketplace einen Überblick über ebendiesen Dienst der Windows Azure Platform. Zusammen mit Steve Marx und Wade Wegner spricht er über Daten und Anwendungen im Windows Azure Marketplace.
Weitere Nachrichten in dieser Channel-9-Folge
Mein Kollege, Bruno Terkaly, hat eine tolle Blog-Serie verfasst, in der er auf die Erstellung eines Android-Clients eingeht, der auf einen REST-Service aus Windows Azure zugreift. Die Blog-Serie besteht aktuell aus folgenden acht Teilen:
“Schon wieder ein Feedback-Formular, das ich ausfüllen soll?…” – das denke sicher nicht nur ich, wenn ich am Morgen mein E-Mail Postfach einsehe. Und tatsächlich nehmen solche Anfragen zuweilen überhand. Da kann es schon mal passieren, dass man eine solche einfach löscht.
Allerdings: Feedback ist wichtig, wird gehört und kann Dinge verändern!
Mein Kollege, Lars Schmoldt, schreibt in seinem Beitrag auf TechNet, warum es sinnvoll ist, MSDN und TechNet Feedback zu geben:
Alles weitere in Lars’ Artikel. Bei Fragen hierzu bzw. zu TechNet kontaktieren Sie ihn einfach per E-Mail.
Die SQL Azure Gruppe hat die finale Community Technology Preview (CTP) Version des SQL Azure Reporting Service veröffentlicht. Diese Preview ist ab sofort verfügbar und über das Windows Azure Management Portal ohne weiteren Registrierungsprozess verfügbar. Alle bestehenden SQL Azure Abonnenten können diese finale Preview nutzen.
Ebenso verfügbar ist die finale CTP Version des SQL Azure Data Sync Service. Beide Services werden demnächst kommerziell verfügbar. Bis dahin können sich auf Basis von Anwenderfeedbacks (also fleißig Rückmeldung geben!) noch kleinere Änderungen ergeben.
Unter http://www.microsoft.com/windowsazure/features/database/ gibt es weitere Informationen zu den Services sowie eine aktualisierte FAQ-Liste.
Zu Nutzung dieses SQL Azure Reporting Release sind folgende Schritte erforderlich:
Weitere Ressourcen
Im Microsoft Download Center steht ein neues Windows Azure Platform Training Kit zum Herunterladen bereit. Es handelt sich um das September Update, welches unter anderem folgende Neuerungen enthält:
Mein Kollege Alik Levin hat großartige Arbeit geleistet, indem er auf seinem Blog zahlreiche, hilfreiche Online-Ressourcen zu verschiedenen Windows Azure Ressourcen zusammengestellt hat. Diese geben für viele reale Entwicklungsszenarien schnelle Hilfestellung. Zu den Ressourcen zählen…
Die Links zu seinen Blog-Einträgen:
Ich war so frei, und habe einige seiner Links in meine eigene Video-Liste aufgenommen. Hier die Links:
Die Welt lebt nicht nur von der “Public Cloud”, die Microsoft ja erfolgreich mit der Windows Azure Platform auf der PaaS-Ebene und Office 365 auf der SaaS-Ebene anbietet. Der Aufbau einer “Private-Cloud”-Umgebung ist auf Basis der Microsoft Plattform ebenfalls möglich. Hierzu gibt es eine Vielzahl an Online-Ressourcen. Die wichtigsten hat mein Kollege Lars Schmoldt zusammengestellt:
Weiterbildungsangebote
Downloads
Die Links finden sich auch auf meiner Sammlung an Web-Ressourcen rund um Cloud Computing.
Die Build-Konferenz letzter Woche brachte neben vielen Sessions zu Windows 8 auch eine große Zahl an Vorträgen rund um die Themen Cloud und Windows Azure Platform (zum Teil in Kombination mit Windows 8. Folgende Tabelle zeigt alle Sessions mit Bezug zu den genannten Themen. Zu allen Vorträgen finden sich die Links zur den Slidedecks sowie Links zu den Videos (jeweils MP4 sowie WMVs in mittlerer (WMV-M) und hoher (WMV-H) Auflösung).
Die letzte Woche in Los Angeles abgehaltene BUILD-Konferenz stand ganz im Zeichen von Windows 8. Neben zahlreichen Details zu Oberfläche, Entwickleroptionen gab es auch eine Developer-Preview zum Download. Dabei ist fast untergegangen, dass es auch zur Windows Azure Platform Neuerungen gab:
Windows Azure SDK 1.5
Gegenüber dem August-Release des Windows Azure SDKs hat das neue SDK einige entscheidende Verbesserungen:
Und auch die Tools für Visual Studio haben einige Verbesserungen erhalten:
Geo-Replikation
Mit dieser Funktion werden Inhalte aus Windows Azure Blob- und Table-Storage zwischen Rechenzentren einer Region repliziert, ohne dass hierbei zusätzliche Kosten für die Nutzer anfallen. Diese Replikation dient dem Desaster Recovery. Dabei kommen Rechenzentren zum Einsatz, die mindestens 100km voneinander entfernt liegen. Grundsätzlich ist diese Replikation aktiviert, kann auf Wunsch aber auch deaktiviert werden.
Neue Funktionen für Blob, Table und Queue Storage
Auch der Windows Azure Storage hat Neuerungen erhalten:
Windows Azure Toolkit for Windows 8
Mit Hilfe des Windows Azure Toolkits können leicht Metro-style Apps für Windows 8 entwickelt werden, die Services im Windows Azure Compute Service und Daten in Windows Azure Storage nutzen können. Funktionen sind:
Microsoft setzt damit den Weg fort, die Entwicklung von Azure-Clients für möglichst viele mobile Endgeräte zu unterstützen. Neben dem Toolkit für Windows 8 gibt es auch Toolkits für Windows Phone, iOS und Android. Siehe hierzu auch meine aktualisierte Liste von SDKs und Tools.