Erste Schritte mit Azure Cloud Services (klassisch) und ASP.NET

Übersicht

Wichtig

Cloud Services (klassisch) ist jetzt ab dem 1. September 2024 für alle Kunden veraltet. Alle vorhandenen ausgeführten Bereitstellungen werden beendet und von Microsoft heruntergefahren, und die Daten gehen ab Oktober 2024 dauerhaft verloren. In neuen Bereitstellungen sollte das neue auf Azure Resource Manager basierende Bereitstellungsmodell für Azure Cloud Services (erweiterter Support) verwendet werden.

Dieses Tutorial behandelt die Erstellung einer .NET-Anwendung mit mehreren Ebenen und einem ASP.NET Model View Controller (MVC)-Front-End sowie die Bereitstellung dieser Anwendung in einem Azure-Clouddienst. Die Anwendung verwendet eine Azure SQL-Datenbank, den Azure-Blobdienst und den Azure-Warteschlangendienst. Sie können das Visual Studio-Projekt aus der Microsoft Developer Network (MSDN)-Codegalerie (Microsoft Developer Network) herunterladen.

In diesem Tutorial erfahren Sie, wie Sie die Anwendung erstellen und lokal ausführen, in Azure bereitstellen und in der Cloud ausführen sowie von Grund auf erstellen können. Sie können auch mit der Erstellung von Grund auf beginnen und die Test- und Bereitstellungsschritte anschließend ausführen.

Contoso Ads-Anwendung

Bei dieser Anwendung handelt es sich um ein Bulletin Board für Werbung. Benutzer können eine Werbung erstellen, indem sie Text eingeben und ein Bild hochladen. Die Anwendung zeigt eine Liste mit Werbeeinblendungen mit Miniaturbildern an, und Benutzer können auf eine Werbung klicken, um das Bild in voller Größe anzuzeigen.

Abbildung der Werbungsliste

Die Anwendung verwendet das warteschlangenorientierte Arbeitsmuster , um die CPU-intensive Last der Erstellung von Miniaturbildern an einen Back-End-Prozess auszulagern.

Alternative Architektur: App Service und WebJobs

In diesem Tutorial erfahren Sie, wie Sie Front-End und Back-End in einem Azure-Clouddienst ausführen können. Alternativ können Sie das Front-End in Azure App Service ausführen und die WebJobs-Funktion für das Back-End verwenden. Ein Lernprogramm zu WebJobs finden Sie unter Erste Schritte mit dem Azure WebJobs SDK. Informationen zur Auswahl der optimalen Dienste für Ihr Szenario finden Sie unter Azure App Service, Azure Virtual Machines, Service Fabric und Azure Cloud Services im Vergleich.

Lernziele

  • Ermöglichen der Azure-Entwicklung auf Ihrem Computer durch Installieren des Azure SDK
  • Erstellen eines Clouddienst-Projekts in Visual Studio mit einer ASP.NET MVC-Webrolle und einer Workerrolle.
  • Lokale Tests des Clouddienstprojekts mithilfe des Azure-Speicheremulators.
  • Veröffentlichen des Cloudprojekts in einem Azure-Clouddienst und Tests mit einem Azure-Speicherkonto.
  • Hochladen von Dateien und Speicherung der Dateien im Azure-Blobdienst.
  • Verwenden des Azure-Warteschlangendiensts für die Kommunikation zwischen Ebenen.

Voraussetzungen

Dieses Tutorial setzt voraus, dass Sie mit den Grundkonzepten von Azure-Clouddiensten, z.B. den Begriffen Webrolle und Workerrolle, vertraut sind. Außerdem wird vorausgesetzt, dass Sie mit der Arbeit mit ASP.NET MVC- oder Web Forms-Projekten in Visual Studio vertraut sind. Die Beispielanwendung verwendet MVC, aber ein Großteil des Tutorial gilt auch für Web Forms.

Sie können die Anwendung ohne Azure-Abonnement lokal ausführen, aber für die Bereitstellung der Anwendung in der Cloud benötigen Sie ein Abonnement. Wenn Sie kein Konto haben, können Sie Ihre MSDN-Abonnentenvorteile aktivieren oder sich für eine kostenlose Testversion registrieren.

Die Anweisungen im Tutorial funktionieren mit allen der folgenden Produkte:

  • Visual Studio 2013
  • Visual Studio 2015
  • Visual Studio 2017
  • Visual Studio 2019

Falls Sie keines dieser Produkte besitzen, wird Visual Studio möglicherweise zusammen mit dem Azure SDK installiert.

Anwendungsarchitektur

Die Anwendung speichert Werbungen in einer SQL-Datenbank und verwendet Entity Framework Code First, um Tabellen zu erstellen und auf Daten zuzugreifen. Pro Werbung werden in der Datenbank zwei URLs gespeichert: eine für das Bild in voller Größe und eine für die Miniaturansicht.

Abbildung einer Werbungstabelle

Wenn ein Benutzer ein Bild hochlädt, speichert das in einer Webrolle ausgeführte Front-End das Bild in einem Azure-Blobund speichert die Werbeinformationen in der Datenbank zusammen mit einer URL, die auf das Blob zeigt. Gleichzeitig wird eine Nachricht in eine Azure-Warteschlange geschrieben. Ein in einer Workerrolle ausgeführter Back-End-Prozess prüft die Warteschlange regelmäßig auf neue Nachrichten. Wenn eine neue Nachricht vorhanden ist, erstellt die Workerrolle eine Miniaturansicht für das Bild und aktualisiert das entsprechende Datenbankfeld mit der URL für diese Werbung. Das folgende Diagramm zeigt die Interaktion der verschiedenen Anwendungskomponenten:

Diagramm: Interaktion zwischen den verschiedenen Anwendungskomponenten

Einrichten der Entwicklungsumgebung

Richten Sie zu Beginn Ihre Entwicklungsumgebung mit Visual Studio und dem Azure SDK ein.

  • Visual Studio 2019 enthält das Azure SDK. Wenn Sie Visual Studio 2019 verwenden, ist keine zusätzliche Einrichtung für die Entwicklungsumgebung erforderlich.

  • Klicken Sie bei Visual Studio 2015 auf den folgenden Link, um das Azure SDK für Visual Studio 2015 zu installieren.

  • Klicken Sie bei Visual Studio 2013 auf den folgenden Link, um das Azure SDK für Visual Studio 2013 zu installieren.

  • Wenn Visual Studio nicht installiert ist, gehen Sie wie folgt vor, um Visual Studio 2019 mit dem Azure SDK zu installieren.

Hinweis

Abhängig von der Anzahl an bereits bestehenden SDK-Abhängigkeiten auf Ihrem Computer kann der Installationsvorgang des SDK von mehreren Minuten bis hin zu einer halben Stunde oder länger dauern.

Herunterladen und Ausführen der abgeschlossenen Lösung

  1. Laden Sie die abgeschlossene Lösungherunter und entzippen Sie das Archiv.

  2. Starten Sie Visual Studio.

  3. Wählen Sie im Menü Datei die Option Projekt öffnen, navigieren Sie zu dem Ort, an dem Sie die Lösung gespeichert haben, und öffnen Sie die Lösungsdatei.

  4. Drücken Sie STRG+UMSCHALT+B, um die Projektmappe zu erstellen.

    Standardmäßig stellt Visual Studio den Inhalt des NuGet-Pakets automatisch wieder her, das nicht in der .zip -Datei enthalten war. Wenn die Pakete nicht wiederhergestellt werden, installieren Sie diese manuell, indem Sie das Dialogfeld NuGet-Pakete verwalten öffnen und rechts oben auf Wiederherstellen klicken.

  5. Vergewissern Sie sich im Projektmappen-Explorer, dass ContosoAdsCloudService als Startprojekt ausgewählt ist.

  6. Wenn Sie Visual Studio 2015 oder höher verwenden, ändern Sie die SQL Server-Verbindungszeichenfolge in der Anwendungsdatei Web.config des ContosoAdsWeb-Projekts und in der Datei ServiceConfiguration.Local.cscfg des ContosoAdsCloudService-Projekts. Ändern Sie in beiden Fällen „(localdb)\v11.0“ in „(localdb)\MSSQLLocalDB“.

  7. Um die Anwendung auszuführen drücken Sie STRG+F5.

    Wenn Sie ein Clouddienstprojekt lokal ausführen, startet Visual Studio automatisch Azure-Serveremulator und Azure-Speicheremulator. Der Serveremulator verwendet die Ressourcen Ihres Computers, um die Umgebungen von Web- und Workerrolle zu simulieren. Der Speicheremulator verwendet eine SQL Server Express LocalDB -Datenbank, um den Azure-Cloudspeicher zu simulieren.

    Wenn Sie ein Clouddienstprojekt zum ersten Mal ausführen, kann der Start der Emulatoren ca. eine Minute in Anspruch nehmen. Wenn die Emulatoren gestartet sind, wird der Standardbrowser mit der Startseite der Anwendung geöffnet.

    Contoso Ads-Architektur 1

  8. Wählen Sie Anzeige erstellen aus.

  9. Geben Sie einige Testdaten ein, wählen Sie ein hochzuladendes .jpg -Bild aus, und wählen Sie Erstellen.

    Abbildung der Seite „Erstellen“

    Die Anwendung wechselt zur Indexseite, zeigt jedoch noch keine Miniaturansicht für die neue Werbung an, da diese Verarbeitung noch nicht erfolgt ist.

  10. Warten Sie einen Moment und aktualisieren Sie die Indexseite, um die Miniaturansicht zu sehen.

    Indexseite

  11. Wählen Sie Details für Ihre Werbung, um das Bild in voller Größe anzuzeigen.

    Detailseite

Sie haben die Anwendung bislang komplett auf Ihrem lokalen Computer ausgeführt, ohne Verbindung mit der Cloud. Der Speicheremulator speichert die Warteschlangen- und Blobdaten in einer SQL Server Express LocalDB-Datenbank, und die Anwendung speichert die Werbedaten in einer weiteren LocalDB-Datenbank. Entity Framework Code First hat die Werbedatenbank automatisch erstellt, als die Webanwendung zum ersten Mal versucht hat, darauf zuzugreifen.

Im folgenden Abschnitt werden Sie die Lösung so konfigurieren, dass diese Azure-Cloudressourcen für Warteschlangen, Blobs und die Anwendungsdatenbank verwendet, wenn sie in der Cloud ausgeführt wird. Falls die Ausführung weiterhin lokal erfolgen soll, Sie aber Speicher- und Datenbankressourcen in der Cloud nutzen möchten, ist dies möglich. Hierfür müssen lediglich die Verbindungszeichenfolgen entsprechend festgelegt werden. Dies wird weiter unten beschrieben.

Bereitstellen der Anwendung in Azure

Führen Sie folgende Schritte aus, um die Anwendung in der Cloud auszuführen:

  • Erstellen eines Azure-Clouddiensts
  • Erstellen Sie eine Datenbank in Azure SQL-Datenbank.
  • Erstellen Sie ein Azure-Speicherkonto.
  • Konfigurieren der Lösung zur Verwendung Ihrer Datenbank bei der Ausführung in Azure
  • Konfigurieren der Lösung zur Verwendung Ihres Azure-Speicherkontos bei der Ausführung in Azure
  • Bereitstellen des Projekts in Ihrem Azure-Clouddienst

Erstellen eines Azure-Clouddiensts

Ein Azure-Clouddienst ist die Umgebung, in der die Anwendung ausgeführt wird.

  1. Öffnen Sie das Azure-Portal in Ihrem Browser.

  2. Wählen Sie Ressource erstellen > Compute > Clouddienst.

  3. Geben Sie im Eingabefeld für den DNS-Namen (Domain Name System) ein URL-Präfix für den Clouddienst ein.

    Diese URL muss eindeutig sein. Sie erhalten eine Fehlermeldung, falls das eingegebene Präfix bereits verwendet wird.

  4. Geben Sie eine neue Ressourcengruppe für den Dienst an. Wählen Sie Neu erstellen, und geben Sie dann einen Namen im Eingabefeld „Ressourcengruppe“ ein, z.B. „CS_contososadsRG“.

  5. Wählen Sie die Region aus, in der Sie Ihre Anwendung bereitstellen möchten.

    Dieses Feld gibt an, in welchem Datencenter der Clouddienst gehostet wird. Für eine Produktionsanwendung würden Sie die für Ihre Kunden am nächsten gelegene Region auswählen. Wählen Sie für dieses Tutorial die Ihnen am nächsten gelegene Region aus.

  6. Klicken Sie auf Erstellen.

    In der folgenden Abbildung wird ein Clouddienst mit der URL „CSvccontosoads.cloudapp.net“ erstellt.

    Abbildung eines neuen Clouddiensts

Erstellen einer Datenbank in Azure SQL-Datenbank

Wenn die Anwendung in der Cloud ausgeführt wird, verwendet sie eine cloudbasierte Datenbank.

  1. Wählen Sie im Azure-Portal Ressource erstellen > Datenbanken> SQL Datenbank.

  2. Geben Sie unter Datenbankname den Wert contosoadsein.

  3. Wählen Sie in der Gruppe Ressource die Option Vorhandene verwenden aus, und wählen Sie die für den Clouddienst verwendete Ressourcengruppe aus.

  4. Wählen Sie in der folgenden Abbildung Server – Erforderliche Einstellungen konfigurieren und dann auf Neuen Server erstellen.

    Tunnel zum Datenbankserver

    Falls Ihr Abonnement bereits einen Server enthält, können Sie auch diesen Server aus der Dropdownliste auswählen.

  5. Geben Sie im Feld Servername den Namen csvccontosodbserver ein.

  6. Geben Sie unter Anmeldename und Kennwort die Anmeldedaten eines Administrators ein.

    Wenn Sie Neuen Server erstellen ausgewählt haben, geben Sie hier keinen vorhandenen Namen und kein Kennwort ein. Sie geben einen neuen Namen und das dazugehörige Kennwort ein. Diese Angaben werden hier zur späteren Verwendung für den Zugriff auf die Datenbank definiert. Wenn Sie einen zuvor erstellten Server ausgewählt haben, fordert das Portal Sie auf, das Kennwort für den zuvor erstellten Administratorbenutzer einzugeben.

  7. Wählen Sie denselben Standort wie für Ihren Clouddienst aus.

    Wenn sich Clouddienst und Datenbank in unterschiedlichen Datencentern (d. h. unterschiedlichen Regionen) befinden, steigt die Latenz an und es fallen Kosten für die Bandbreite außerhalb des Rechenzentrums an. Die Bandbreite innerhalb eines Datencenters ist kostenlos.

  8. Aktivieren Sie die Option Azure-Diensten Zugriff auf den Server erlauben.

  9. Wählen Sie Auswählen für den neuen Server aus.

    Neuer Server

  10. Wählen Sie Erstellen.

Erstellen eines Azure-Speicherkontos

Azure-Speicherkonten bieten Ressourcen zum Speichern von Warteschlangen- und Blobdaten in der Cloud.

In einer tatsächlichen Anwendung würden Sie normalerweise separate Konten für Anwendungsdaten und Protokolldaten sowie für Test- und Produktionsdaten erstellen. In diesem Tutorial verwenden wir nur ein einzelnes Konto.

  1. Wählen Sie im Azure-Portal Ressource erstellen > Speicher> Speicherkonto - Blob, Tabelle, Warteschlange.

  2. Geben Sie im Feld Name ein URL-Präfix ein.

    Dieses Präfix zusammen mit dem Text unterhalb des Eingabefelds ergibt die eindeutige URL Ihres Speicherkontos. Wenn das von Ihnen eingegebene Präfix bereits von einer anderen Person verwendet wird, wählen Sie ein anderes Präfix aus.

  3. Legen Sie das Bereitstellungsmodell auf Klassisch fest.

  4. Wählen Sie in der Dropdownliste Replikation den Wert Lokal redundanter Speicher aus.

    Wenn die Georeplikation für ein Speicherkonto aktiviert ist, werden dessen Inhalte in einem sekundären Datencenter repliziert, damit ein Failover möglich ist, falls es am primären Standort zu einem Katastrophenfall kommt. Für die Georeplikation können zusätzliche Kosten anfallen. Für Test- und Entwicklungskonten macht es wenig Sinn, für Georeplikation zu bezahlen. Weitere Informationen finden Sie unter Erstellen, Verwalten oder Löschen eines Speicherkontos.

  5. Wählen Sie in der Gruppe Ressource die Option Vorhandene verwenden aus, und wählen Sie die für den Clouddienst verwendete Ressourcengruppe aus.

  6. Wählen Sie in der Dropdownliste Standort dieselbe Region aus, die Sie für den Clouddienst ausgewählt haben.

    Wenn sich Clouddienst und Speicherkonto in unterschiedlichen Rechenzentren (d. h. unterschiedlichen Regionen) befinden, steigt die Latenz an und Sie müssen für die Bandbreite außerhalb des Datencenters bezahlen. Die Bandbreite innerhalb eines Datencenters ist kostenlos.

    Mit Azure-Affinitätsgruppen können Sie die Distanz zwischen Ressourcen in einem Datencenter und somit die Latenz minimieren. Dieses Tutorial verwendet keine Affinitätsgruppen. Anweisungen finden Sie unter Erstellen einer Affinitätsgruppe in Azure.

  7. Wählen Sie Erstellen.

    Neues Speicherkonto

    In der Abbildung wird ein Speicherkonto mit der URL csvccontosoads.core.windows.neterstellt.

Konfigurieren der Lösung zur Verwendung Ihrer Datenbank in Azure SQL-Datenbank bei der Ausführung in Azure

Webprojekt und Workerrollenprojekt weisen jeweils eigene Datenbank-Verbindungszeichenfolgen auf. Beide müssen auf die Datenbank in Azure SQL-Datenbank zeigen, wenn die App in Azure ausgeführt wird.

Sie werden eine Web.config-Transformation für die Webrolle und eine Clouddienst-Umgebungseinstellung für die Workerrolle verwenden.

Hinweis

In diesem und im nächsten Abschnitt speichern Sie Anmeldeinformationen in Projektdateien. Sie sollten keine sensiblen Daten in öffentlichen Quellcode-Repositorys speichern.

  1. Öffnen Sie im ContosoAdsWeb-Projekt die Transformationsdatei Web.Release.config für die Anwendungsdatei Web.config, löschen Sie den Kommentarblock, der ein <connectionStrings>-Element enthält, und fügen Sie den folgenden Code an derselben Stelle ein.

    <connectionStrings>
        <add name="ContosoAdsContext" connectionString="{connectionstring}"
        providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
    

    Lassen Sie die Datei geöffnet.

  2. Wählen Sie im Azure-Portal im linken Bereich SQL-Datenbanken, und wählen Sie die Datenbank, die Sie für dieses Tutorial erstellt haben, und dann auf Verbindungszeichenfolgen anzeigen.

    Verbindungszeichenfolgen anzeigen

    Die Verbindungszeichenfolgen werden im Portal angezeigt, mit einem Platzhalter für das Kennwort.

    Verbindungszeichenfolgen

  3. Löschen Sie in der Transformationsdatei Web.Release.config den Teil {connectionstring}, und fügen Sie stattdessen die ADO.NET-Verbindungszeichenfolge aus dem Azure-Portal ein.

  4. Ersetzen Sie in der Verbindungszeichenfolge, die Sie in die Transformationsdatei Web.Release.config eingefügt haben, {your_password_here} durch das Kennwort, das Sie für die neue SQL-Datenbank eingerichtet haben.

  5. Speichern Sie die Datei .

  6. Kopieren Sie die Verbindungszeichenfolge (ohne die umgebenden Anführungszeichen), um diese in den folgenden Schritten bei der Konfiguration des Workerrollen-Projekts zur Verfügung zu haben.

  7. Klicken Sie im Projektmappen-Explorer unter Rollen im Clouddienstprojekt mit der rechten Maustaste auf ContosoAdsWorker, und wählen Sie Eigenschaften.

    Screenshot: Hervorhebung der Menüoption „Eigenschaften“

  8. Wählen Sie die Registerkarte Einstellungen aus.

  9. Ändern Sie die Dienstkonfiguration in Cloud.

  10. Wählen Sie für die ContosoAdsDbConnectionString-Einstellung das Feld Wert aus, und fügen Sie die Verbindungszeichenfolge ein, die Sie im vorherigen Abschnitt des Tutorials kopiert haben.

    Datenbank-Verbindungszeichenfolge für Workerrolle

  11. Speichern Sie die Änderungen.

Konfigurieren der Lösung zur Verwendung Ihres Azure-Speicherkontos bei der Ausführung in Azure

Die Verbindungszeichenfolgen für das Azure-Speicherkonto für das Web- und Workerrollenprojekt werden in Umgebungseinstellungen für das Clouddienstprojekt gespeichert. Für jedes Projekt existiert je ein separater Satz mit Einstellungen für die lokale Ausführung der Anwendung und für die Ausführung in der Cloud. Sie werden die Cloudumgebungseinstellungen für Web- und Workerrollenprojekt ändern.

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf ContosoAdsWeb unter Rollen im Projekt ContosoAdsCloudService, und wählen Sie dann Eigenschaften.

    Abbildung der Rolleneigenschaften

  2. Wählen Sie die Registerkarte Einstellungen aus. Wählen Sie in der Dropdownliste Dienstkonfiguration den Wert Cloud aus.

    Cloudkonfiguration

  3. Wenn Sie den Eintrag StorageConnectionString auswählen, sehen Sie am Ende der Zeile eine Schaltfläche mit Auslassungspunkten (...). Wählen Sie die Schaltfläche mit den Auslassungspunkten, um das Dialogfeld Verbindungszeichenfolge für Speicherkonto erstellen zu öffnen.

    Erstellungsdialog für Verbindungszeichenfolge

  4. Wählen Sie im Dialogfeld Verbindungszeichenfolge für SpeicherkontoIhr Abonnement, wählen Sie das zuvor erstellte Speicherkonto aus, und wählen Sie OK. Der Explorer fordert Sie zur Eingabe Ihrer Azure-Kontoanmeldeinformationen auf, wenn Sie sich noch anmelden müssen.

    Speicherkonto-Verbindungszeichenfolge erstellen

  5. Speichern Sie die Änderungen.

  6. Führen Sie zum Einrichten der Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString-Verbindungszeichenfolge die gleichen Schritte aus, die Sie auch für die StorageConnectionString-Verbindungszeichenfolge ausgeführt haben.

    Diese Verbindungszeichenfolge wird für die Protokollierung verwendet.

  7. Wiederholen Sie die Prozedur, die Sie für die ContosoAdsWeb-Rolle verwendet haben, um die beiden Verbindungszeichenfolgen für die ContosoAdsWorker-Rolle zu setzen. Vergessen Sie nicht, die Dienstkonfiguration auf Cloud zu setzen.

Die Einstellungen, die Sie für die Rollenumgebung in der Visual Studio-GUI konfiguriert haben, werden in den folgenden Dateien im ContosoAdsCloudService-Projekt gespeichert:

  • ServiceDefinition.csdef - Definiert die Einstellungsnamen.
  • ServiceConfiguration.Cloud.cscfg - Enthält die Werte für die Ausführung der Anwendung in der Cloud.
  • ServiceConfiguration.Local.cscfg - Enthält die Werte für die lokale Ausführung der Anwendung.

Die Datei „Servicedefinition.csdef“ enthält beispielsweise die folgenden Definitionen:

<ConfigurationSettings>
    <Setting name="StorageConnectionString" />
    <Setting name="ContosoAdsDbConnectionString" />
</ConfigurationSettings>

Und die Datei ServiceConfiguration.Cloud.cscfg enthält die Werte, die Sie für diese Einstellungen in Visual Studio eingegeben haben:

<Role name="ContosoAdsWorker">
    <Instances count="1" />
    <ConfigurationSettings>
        <Setting name="StorageConnectionString" value="{yourconnectionstring}" />
        <Setting name="ContosoAdsDbConnectionString" value="{yourconnectionstring}" />
        <!-- other settings not shown -->

    </ConfigurationSettings>
    <!-- other settings not shown -->

</Role>

Die <Instances>-Einstellung definiert die Anzahl der virtuellen Computer, auf denen Azure den Code der Workerrolle ausführt. Im Bereich Nächste Schritte finden Sie Links zu weiteren Hinweisen zur Skalierung von Clouddiensten.

Bereitstellen des Projekts in Azure

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Cloudprojekt ContosoAdsCloudService, und wählen Sie Veröffentlichen aus.

    Veröffentlichungsmenü

  2. Wählen Sie im Schritt Anmelden des Assistenten zum Veröffentlichen einer Azure-AnwendungWeiter.

    Anmeldung

  3. Wählen Sie im Schritt Einstellungen des Assistenten Weiter.

    Schritt

    Die Standardeinstellungen in der Registerkarte Erweitert brauchen für dieses Tutorial nicht geändert werden. Weitere Informationen zur Registerkarte Erweitert finden Sie unter Assistent zum Veröffentlichen einer Azure-Anwendung.

  4. Wählen Sie im Schritt Zusammenfassung Veröffentlichen aus.

    Zusammenfassung

    Das Azure-Aktivitätsprotokoll wird in Visual Studio geöffnet.

  5. Wählen Sie den Pfeil nach rechts, um die Bereitstellungsdetails zu erweitern.

    Die Bereitstellung kann 5 oder mehr Minuten in Anspruch nehmen.

    Azure-Aktivitätsprotokoll

  6. Wählen Sie nach Abschluss der Bereitstellung die Web-App-URL, um die Anwendung zu starten.

  7. Sie können die Anwendung nun testen und Werbungen erstellen, anzeigen und bearbeiten, wie Sie dies bereits bei der lokalen Ausführung getan haben.

Hinweis

Nach Abschluss der Tests sollten Sie den Clouddienst anhalten oder löschen. Selbst wenn Sie den Clouddienst nicht nutzen, fallen Kosten an, da Ressourcen auf virtuellen Computern für den Dienst reserviert sind. Wenn Sie den Dienst laufen lassen, kann jeder, der die URL findet, Werbungen erstellen und anzeigen. Navigieren Sie im Azure-Portal zur Registerkarte Übersicht für Ihren Clouddienst, und klicken Sie dann oben auf der Seite auf die Schaltfläche Löschen. Klicken Sie stattdessen auf Anhalten , um vorübergehend zu verhindern, dass andere Personen auf die Website zugreifen. In diesem Fall entstehen weiterhin Kosten. Sie können die SQL-Datenbank und das Speicherkonto auf ähnliche Weise löschen, wenn Sie diese nicht mehr benötigen.

Neuerstellen der Anwendung

Wenn Sie die fertige Anwendung noch herunterladenmüssen, führen Sie dies jetzt aus. Kopieren Sie die Dateien aus dem heruntergeladenen Projekt in das neue Projekt.

Die Erstellung der Contoso-Werbeanwendung umfasst die folgenden Schritte:

  • Erstellen einer Clouddienst-Lösung in Visual Studio
  • Aktualisieren und Hinzufügen von NuGet-Paketen
  • Projektverweise setzen.
  • Konfigurieren von Verbindungszeichenfolgen
  • Hinzufügen von Codedateien

Nach der Erstellung der Lösung werden Sie den Code prüfen, der speziell für Clouddienst-Projekte, Azure-Blobs und -Warteschlangen gilt.

Erstellen einer Clouddienst-Lösung in Visual Studio

  1. Klicken Sie in Visual Studio im Menü Neues Projekt from the Neues Projekt .

  2. Erweitern Sie im linken Bereich des Dialogfelds Neues Projekt den Eintrag Visual C# , wählen Sie den Vorlagentyp Cloud aus, und klicken Sie auf die Vorlage Azure Cloud Service.

  3. Geben Sie den Namen ContosoAdsCloudService für Projekt und Lösung ein, und wählen Sie OK.

    Neues Projekt

  4. Fügen Sie im Dialogfeld Neuer Azure-Clouddienst eine Web- und eine Workerrolle hinzu. Nennen Sie die Webrolle ContosoAdsWeb und die Workerrolle ContosoAdsWorker. (Klicken Sie auf das Stiftsymbol auf der rechten Seite, um die Standardnamen der Rollen zu ändern.)

    Neues Clouddienst-Projekt

  5. Wenn das Dialogfeld Neues ASP.NET-Projekt für die Webrolle angezeigt wird, wählen Sie die MVC-Vorlage aus, und wählen Sie Authentifizierung ändern.

    Authentifizierung ändern

  6. Wählen Sie im Dialogfeld Authentifizierung ändernKeine Authentifizierung und dann OK.

    Keine Authentifizierung

  7. Wählen Sie im Dialogfeld Neues ASP.NET-Projekt OK.

  8. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Lösung (nicht auf eines der Projekte), und klicken Sie auf Hinzufügen – Neues Projekt.

  9. Wählen Sie im Dialogfeld Neues Projekt hinzufügen unter Visual C# im linken Bereich Windows, und wählen Sie die Vorlage Klassenbibliothek.

  10. Benennen Sie das Projekt ContosoAdsCommon, und wählen Sie OK.

    Sie müssen in Web- und Workerrolle auf den Entity Framework-Kontext und das Datenmodell verweisen. Alternativ könnten Sie die EF-bezogenen Klassen im Webrollenprojekt definieren und im Workerrollenprojekt auf dieses Projekt verweisen. In diesem Fall würde Ihr Workerrollenprojekt aber auf Webassemblys verweisen, die es nicht benötigt.

Aktualisieren und Hinzufügen von NuGet-Paketen

  1. Öffnen Sie das Dialogfeld NuGet-Pakete verwalten für die Lösung.

  2. Wählen Sie oben im Fenster Updatesaus.

  3. Suchen Sie nach dem Paket WindowsAzure.Storage. Wenn es sich in der Liste befindet, wählen Sie es aus, und wählen Sie anschließend die Web- und Workerprojekte aus, in denen es aktualisiert werden soll. Wählen Sie dann Aktualisieren.

    Die Speicherclientbibliothek wird häufiger aktualisiert als die Visual Studio-Projektvorlagen. Daher wird es eventuell vorkommen, dass Sie die Version in einem neu erstellten Projekt aktualisieren müssen.

  4. Wählen Sie oben im Fenster Durchsuchenaus.

  5. Suchen Sie das NuGet-Paket EntityFramework und installieren Sie es in allen drei Projekten.

  6. Suchen Sie das NuGet-Paket Microsoft.WindowsAzure.ConfigurationManager , und installieren Sie es im Workerrollenprojekt.

Setzen von Projektverweisen

  1. Fügen Sie im Projekt ContosoAdsWeb einen Verweis auf das Projekt ContosoAdsCommon ein. Klicken Sie mit der rechten Maustaste auf das Projekt ContosoAdsWeb, und wählen Sie Verweise - Verweise hinzufügen. Wählen Sie im Dialogfeld Verweis-Manager im linken Bereich Projektmappe – Projekte und dann ContosoAdsCommon aus, und wählen Sie OK.

  2. Fügen Sie im Projekt ContosoAdsWorker einen Verweis auf das Projekt ContosoAdsCommon ein.

    ContosoAdsCommon enthält das Entity Framework-Datenmodell und die Kontextklasse, die sowohl das Front-End als auch das Back-End verwendet.

  3. Fügen Sie im Projekt "ContosoAdsWorker" einen Verweis auf System.Drawingein.

    Diese Assembly wird vom Back-End für die Konvertierung von Bildern zu Miniaturansichten verwendet.

Konfigurieren von Verbindungszeichenfolgen

In diesem Abschnitt konfigurieren Sie die Verbindungszeichenfolgen für Azure Storage und SQL für lokale Tests. In den Bereitstellungsanweisungen weiter oben in diesem Tutorial wurde beschrieben, wie Sie die Verbindungszeichenfolgen für die Ausführung der Anwendung in der Cloud einrichten.

  1. Öffnen Sie im Projekt "ContosoAdsWeb" die Datei "Web.config" der Anwendung, und fügen Sie das folgende connectionStrings-Element nach dem configSections-Element ein.

    <connectionStrings>
        <add name="ContosoAdsContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=ContosoAds; Integrated Security=True; MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    Wenn Sie Visual Studio 2015 oder höher verwenden, ersetzen Sie „v11.0“ durch „MSSQLLocalDB“.

  2. Speichern Sie die Änderungen.

  3. Klicken Sie im Projekt ContosoAdsCloudService unter Rollen mit der rechten Maustaste auf ContosoAdsWeb, und wählen Sie Eigenschaften.

    Abbildung mit Rolleneigenschaften

  4. Wählen Sie im Eigenschaftenfenster ContosoAdsWeb [Rolle] die Registerkarte Einstellungen, und wählen Sie Einstellung hinzufügen.

    Behalten Sie für Dienstkonfiguration die Einstellung Alle Konfigurationen bei.

  5. Fügen Sie eine Einstellung mit dem Namen StorageConnectionString hinzu. Legen Sie Typ auf ConnectionString fest, und legen Sie den Wert auf UseDevelopmentStorage=true fest.

    Neue Verbindungszeichenfolge

  6. Speichern Sie die Änderungen.

  7. Wiederholen Sie die Prozedur, mit der Sie eine Speicher-Verbindungszeichenfolge zu den ContosoAdsWorker-Rolleneigenschaften hinzugefügt haben.

  8. Fügen Sie ebenfalls noch im ContosoAdsWorker [Role] -Eigenschaftenfenster eine weitere Verbindungszeichenfolge hinzu:

    • Name: ContosoAdsDbConnectionString

    • Typ: String

    • Wert: Fügen Sie dieselbe Verbindungszeichenfolge ein, die Sie auch für das Webrollenprojekt verwendet haben. (Das folgende Beispiel bezieht sich auf Visual Studio 2013. Wenn Sie Visual Studio 2015 oder höher verwenden und dieses Beispiel kopieren, dürfen Sie nicht vergessen, den Wert für „Datenquelle“ zu ändern.)

      Data Source=(localdb)\v11.0; Initial Catalog=ContosoAds; Integrated Security=True; MultipleActiveResultSets=True;
      

Hinzufügen von Codedateien

In diesem Abschnitt kopieren Sie Codedateien aus der heruntergeladenen Lösung in die neue Lösung. In den folgenden Abschnitten werden die wichtigsten Bereiche des Codes erläutert.

Um Dateien einem Projekt oder einem Ordner hinzuzufügen, klicken Sie mit der rechten Maustaste auf das Projekt bzw. den Ordner und wählen dann Hinzufügen - Vorhandenes Element. Wählen Sie die gewünschten Dateien und dann Hinzufügen aus. Wählen Sie Ja, wenn Sie gefragt werden, ob Sie vorhandene Dateien ersetzen möchten.

  1. Löschen Sie im Projekt ContosoAdsCommon die Datei Class1.cs, und fügen Sie stattdessen die Dateien Ad.cs und ContosoAdscontext.cs aus dem heruntergeladenen Projekt hinzu.

  2. Fügen Sie im Projekt ContosoAdsWeb die folgenden Dateien aus dem heruntergeladenen Projekt hinzu.

    • Global.asax.cs.
    • Im Ordner Views\Shared: _Layout.cshtml.
    • Im Ordner Views\Home: Index.cshtml.
    • Im Ordner Controllers: AdController.cs.
    • Im Ordner Views\Ad (Ordner zuerst erstellen): fünf CSHTML-Dateien.
  3. Fügen Sie im Projekt ContosoAdsWorker die Datei WorkerRole.cs aus dem heruntergeladenen Projekt hinzu.

Sie können die Anwendung nun anhand der weiter oben in diesem Tutorial beschriebenen Prozedur erstellen und ausführen, und die Anwendung wird eine lokale Datenbank und den Speicheremulator verwenden.

In den folgenden Abschnitten wird der Code für die Arbeit mit Azure-Umgebung, Blobs und Warteschlangen beschrieben. Dieses Tutorial befasst sich nicht mit der Erstellung von MVC-Controllern und -Ansichten mithilfe eines Gerüsts, dem Entity Framework-Code für die Arbeit mit SQL Server-Datenbanken und den Grundsätzen asynchroner Programmierung in ASP.NET 4.5. Informationen zu diesen Themen finden Sie in den folgenden Ressourcen:

ContosoAdsCommon - Ad.cs

Die Datei Ad.cs definiert eine Enumeration für Werbekategorien und eine POCO-Entitätsklasse für Werbeinformationen.

public enum Category
{
    Cars,
    [Display(Name="Real Estate")]
    RealEstate,
    [Display(Name = "Free Stuff")]
    FreeStuff
}

public class Ad
{
    public int AdId { get; set; }

    [StringLength(100)]
    public string Title { get; set; }

    public int Price { get; set; }

    [StringLength(1000)]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [StringLength(1000)]
    [DisplayName("Full-size Image")]
    public string ImageURL { get; set; }

    [StringLength(1000)]
    [DisplayName("Thumbnail")]
    public string ThumbnailURL { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime PostedDate { get; set; }

    public Category? Category { get; set; }
    [StringLength(12)]
    public string Phone { get; set; }
}

ContosoAdsCommon - ContosoAdsContext.cs

Die ContosoAdsContext-Klasse gibt an, dass die Ad-Klasse in einer DbSet-Sammlung verwendet wird, die von Entity Framework in einer SQL-Datenbank gespeichert wird.

public class ContosoAdsContext : DbContext
{
    public ContosoAdsContext() : base("name=ContosoAdsContext")
    {
    }
    public ContosoAdsContext(string connString)
        : base(connString)
    {
    }
    public System.Data.Entity.DbSet<Ad> Ads { get; set; }
}

Die Klasse besitzt zwei Konstruktoren. Der erste Konstruktor wird vom Webprojekt verwendet und gibt den Namen einer Verbindungszeichenfolge an, die in der Datei Web.config gespeichert ist. Mit dem zweiten Konstruktor können Sie die tatsächliche Verbindungszeichenfolge übergeben, die vom Workerrollenprojekt verwendet wird, weil dafür keine Web.config-Datei vorhanden ist. Sie haben zuvor gesehen, wo diese Verbindungszeichenfolge gespeichert wurde. Später sehen Sie, wie der Code die Verbindungszeichenfolge abruft, wenn sie die DbContext-Klasse instanziiert.

ContosoAdsWeb - Global.asax.cs

Der aus der Application_Start-Methode aufgerufene Code erstellt einen images-Blobcontainer und eine images-Warteschlange, falls diese noch nicht vorhanden sind. Dieser Code stellt sicher, dass der Code automatisch den erforderlichen Blob-Container und die Warteschlange erstellt, wenn Sie ein neues Speicherkonto verwenden oder den Speicheremulator auf einem neuen Computer verwenden.

Der Code verwendet die Speicher-Verbindungszeichenfolge aus der .cscfg -Datei für den Zugriff auf das Speicherkonto.

var storageAccount = CloudStorageAccount.Parse
    (RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));

Anschließend ruft er einen Verweis auf den images -Blobcontainer ab, erstellt den Container, falls dieser noch nicht existiert, und setzt die Zugriffsberechtigungen für den neuen Container. Standardmäßig erlauben neue Container nur Clients mit Speicherkonto-Anmeldeinformationen den Zugriff auf Blobs. Für die Website müssen die Blobs öffentlich sein, um die Bilder mithilfe der URLs anzuzeigen, die auf die Bild-Blobs zeigen.

var blobClient = storageAccount.CreateCloudBlobClient();
var imagesBlobContainer = blobClient.GetContainerReference("images");
if (imagesBlobContainer.CreateIfNotExists())
{
    imagesBlobContainer.SetPermissions(
        new BlobContainerPermissions
        {
            PublicAccess =BlobContainerPublicAccessType.Blob
        });
}

Ein ähnlicher Codeteil ruft einen Verweis auf die images -Warteschlange ab und erstellt eine neue Warteschlange. In diesem Fall sind keine Berechtigungsänderungen erforderlich.

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
var imagesQueue = queueClient.GetQueueReference("images");
imagesQueue.CreateIfNotExists();

ContosoAdsWeb - _Layout.cshtml

Die Datei _Layout.cshtml legt den App-Namen in der Kopf- und Fußzeile fest und erstellt den Menüeintrag „Ads“.

ContosoAdsWeb - Views\Home\Index.cshtml

Die Datei Views\Home\Index.cshtml zeigt Links zu den Kategorien auf der Startseite an. Die Links übergeben den ganzzahligen Wert aus der Category -Enumeration in einer querystring-Variable an die Ads-Indexseite.

<li>@Html.ActionLink("Cars", "Index", "Ad", new { category = (int)Category.Cars }, null)</li>
<li>@Html.ActionLink("Real estate", "Index", "Ad", new { category = (int)Category.RealEstate }, null)</li>
<li>@Html.ActionLink("Free stuff", "Index", "Ad", new { category = (int)Category.FreeStuff }, null)</li>
<li>@Html.ActionLink("All", "Index", "Ad", null, null)</li>

ContosoAdsWeb - AdController.cs

In der Datei AdController.cs ruft der Konstruktor die InitializeStorage-Methode auf, um Objekte der Azure Storage-Clientbibliothek zu erstellen, die eine API für die Arbeit mit Blobs und Warteschlangen bereitstellen.

Anschließend ruft der Code einen Verweis auf den images-Blobcontainer ab, wie weiter oben in Global.asax.cs gezeigt. Gleichzeitig wird eine angemessene Standard- Wiederholungs-Richtlinie für eine Webanwendung gesetzt. Mit der Standardwiederholungsrichtlinie für exponentielles Backoff kann es passieren, dass die Web-App im Fall eines vorübergehenden Fehlers über eine Minute lang nicht reagiert. Bei der hier gezeigten Richtlinie wird nach jedem Versuch drei Sekunden lang gewartet (für bis zu drei Versuche).

var blobClient = storageAccount.CreateCloudBlobClient();
blobClient.DefaultRequestOptions.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3);
imagesBlobContainer = blobClient.GetContainerReference("images");

Ein ähnlicher Codeteil ruft einen Verweis auf die images -Warteschlange ab.

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
queueClient.DefaultRequestOptions.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3);
imagesQueue = queueClient.GetQueueReference("images");

Ein Großteil des Controller-Codes ist typisch für die Arbeit mit einem Entity Framework-Datenmodell und einer DbContext-Klasse. Eine Ausnahme ist die HttpPost Create -Methode, die eine Datei hochlädt und im Blobspeicher ablegt. Die Modellbindung stellt ein HttpPostedFileBase -Objekt für die Methode bereit.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(
    [Bind(Include = "Title,Price,Description,Category,Phone")] Ad ad,
    HttpPostedFileBase imageFile)

Wenn ein Benutzer eine hochzuladende Datei auswählt, lädt der Code die Datei hoch, speichert sie in einem Blob und aktualisiert den Ad-Datenbankeintrag mit einer URL, die auf den Blob zeigt.

if (imageFile != null && imageFile.ContentLength != 0)
{
    blob = await UploadAndSaveBlobAsync(imageFile);
    ad.ImageURL = blob.Uri.ToString();
}

Der Code für den Upload befindet sich in der UploadAndSaveBlobAsync -Methode. Er erstellt einen GUID-Namen für den Blob, lädt die Datei hoch und speichert sie, und gibt einen Verweis auf den gespeicherten Blob zurück.

private async Task<CloudBlockBlob> UploadAndSaveBlobAsync(HttpPostedFileBase imageFile)
{
    string blobName = Guid.NewGuid().ToString() + Path.GetExtension(imageFile.FileName);
    CloudBlockBlob imageBlob = imagesBlobContainer.GetBlockBlobReference(blobName);
    using (var fileStream = imageFile.InputStream)
    {
        await imageBlob.UploadFromStreamAsync(fileStream);
    }
    return imageBlob;
}

Nachdem mit HttpPost Create -Methode ein Blob hochgeladen und die Datenbank aktualisiert wurde, wird eine Nachricht in der Warteschlange erstellt, um den Back-End-Prozess darüber zu informieren, dass ein Bild für die Konvertierung in eine Miniaturansicht vorliegt.

string queueMessageString = ad.AdId.ToString();
var queueMessage = new CloudQueueMessage(queueMessageString);
await queue.AddMessageAsync(queueMessage);

Der Code für die HttpPost Edit -Methode ist ähnlich, nur müssen hier alle vorhandenen Blobs gelöscht werden, wenn der Benutzer eine neue Bilddatei auswählt.

if (imageFile != null && imageFile.ContentLength != 0)
{
    await DeleteAdBlobsAsync(ad);
    imageBlob = await UploadAndSaveBlobAsync(imageFile);
    ad.ImageURL = imageBlob.Uri.ToString();
}

Das nächste Beispiel zeigt den Code, der Blobs löscht, wenn Sie eine Werbeanzeige löschen.

private async Task DeleteAdBlobsAsync(Ad ad)
{
    if (!string.IsNullOrWhiteSpace(ad.ImageURL))
    {
        Uri blobUri = new Uri(ad.ImageURL);
        await DeleteAdBlobAsync(blobUri);
    }
    if (!string.IsNullOrWhiteSpace(ad.ThumbnailURL))
    {
        Uri blobUri = new Uri(ad.ThumbnailURL);
        await DeleteAdBlobAsync(blobUri);
    }
}
private static async Task DeleteAdBlobAsync(Uri blobUri)
{
    string blobName = blobUri.Segments[blobUri.Segments.Length - 1];
    CloudBlockBlob blobToDelete = imagesBlobContainer.GetBlockBlobReference(blobName);
    await blobToDelete.DeleteAsync();
}

ContosoAdsWeb - Views\Ad\Index.cshtml und Details.cshtml

Die Datei Index.cshtml zeigt Miniaturansichten zusammen mit den restlichen Werbedaten an.

<img src="@Html.Raw(item.ThumbnailURL)" />

Die Datei Details.cshtml zeigt das Bild in voller Größe an.

<img src="@Html.Raw(Model.ImageURL)" />

ContosoAdsWeb - Views\Ad\Create.cshtml und Edit.cshtml

Die Dateien Create.cshtml und Edit.cshtml geben die Formularcodierung an, mit der der Controller das HttpPostedFileBase-Objekt abruft.

@using (Html.BeginForm("Create", "Ad", FormMethod.Post, new { enctype = "multipart/form-data" }))

Ein <input> -Element weist den Browser an, ein Dateiauswahl-Dialogfeld zu öffnen.

<input type="file" name="imageFile" accept="image/*" class="form-control fileupload" />

ContosoAdsWorker - WorkerRole.cs - OnStart-Methode

Die Azure Workerrollen-Umgebung ruft die OnStart-Methode in der WorkerRole-Klasse auf, wenn die Workerrolle gestartet wird, und ruft die Run-Methode auf, wenn die OnStart-Methode abgeschlossen wird.

Die OnStart -Methode ruft die Datenbank-Verbindungszeichenfolge aus der CSCFG -Datei ab und übergibt sie an die DbContext-Klasse des Entity Framework. Der SQLClient-Anbieter wird standardmäßig verwendet, daher muss kein Anbieter angegeben werden.

var dbConnString = CloudConfigurationManager.GetSetting("ContosoAdsDbConnectionString");
db = new ContosoAdsContext(dbConnString);

Anschließend ruft die Methode einen Verweis auf das Speicherkonto ab und erstellt den Blobcontainer und die Warteschlange, falls diese Elemente noch nicht vorhanden sind. Dieser Code ähnelt dem Code, den Sie bereits in der Application_Start -Methode der Webrolle gesehen haben.

ContosoAdsWorker - WorkerRole.cs - Run-Methode

Die Run-Methode wird aufgerufen, wenn die Initialisierung der OnStart-Methode abgeschlossen ist. Die Methode führt eine Endlosschleife aus, die nach neuen Nachrichten in der Warteschlange sucht und diese beim Eintreffen verarbeitet.

public override void Run()
{
    CloudQueueMessage msg = null;

    while (true)
    {
        try
        {
            msg = this.imagesQueue.GetMessage();
            if (msg != null)
            {
                ProcessQueueMessage(msg);
            }
            else
            {
                System.Threading.Thread.Sleep(1000);
            }
        }
        catch (StorageException e)
        {
            if (msg != null && msg.DequeueCount > 5)
            {
                this.imagesQueue.DeleteMessage(msg);
            }
            System.Threading.Thread.Sleep(5000);
        }
    }
}

Nach jedem Durchgang der Schleife geht das Programm für eine Sekunde in den Ruhezustand, wenn keine Nachricht gefunden wurde. Dieser Ruhezustand verhindert, dass die Workerrolle übermäßige Kosten für CPU-Zeit und Speichertransaktionen verursacht. Das Microsoft-Kundenberatungsteam weiß von einem Entwickler zu berichten, der diesen Ruhezustand vergessen hat, seine Anwendung bereitgestellt hat und in den Urlaub gefahren ist. Als er zurückkam, war sein Versehen teurer als der gesamte Urlaub.

Manchmal kann der Inhalt einer Nachricht in der Warteschlange einen Verarbeitungsfehler verursachen. Diese Art von Nachricht wird als „Poison message“ bezeichnet. Wenn Sie lediglich einen Fehler protokolliert und die Schleife neu gestartet haben, können Sie endlos versuchen, diese Nachricht zu verarbeiten. Daher enthält der Catch-Block eine If-Anweisung, die überprüft, wie oft die App versucht hat, die aktuelle Nachricht zu verarbeiten. Wenn die Anzahl höher als fünfmal ist, wird die Nachricht aus der Warteschlange gelöscht.

ProcessQueueMessage wird aufgerufen, wenn eine Warteschlangennachricht gefunden wurde.

private void ProcessQueueMessage(CloudQueueMessage msg)
{
    var adId = int.Parse(msg.AsString);
    Ad ad = db.Ads.Find(adId);
    if (ad == null)
    {
        throw new Exception(String.Format("AdId {0} not found, can't create thumbnail", adId.ToString()));
    }

    CloudBlockBlob inputBlob = this.imagesBlobContainer.GetBlockBlobReference(ad.ImageURL);

    string thumbnailName = Path.GetFileNameWithoutExtension(inputBlob.Name) + "thumb.jpg";
    CloudBlockBlob outputBlob = this.imagesBlobContainer.GetBlockBlobReference(thumbnailName);

    using (Stream input = inputBlob.OpenRead())
    using (Stream output = outputBlob.OpenWrite())
    {
        ConvertImageToThumbnailJPG(input, output);
        outputBlob.Properties.ContentType = "image/jpeg";
    }

    ad.ThumbnailURL = outputBlob.Uri.ToString();
    db.SaveChanges();

    this.imagesQueue.DeleteMessage(msg);
}

Der Code liest die Bild-URL aus der Datenbank, konvertiert das Bild zu einer Miniaturansicht, speichert die Miniaturansicht in einem Blob, aktualisiert die Datenbank mit der URL der Miniaturansicht und löscht die Warteschlangen-Nachricht.

Hinweis

Der Code in der ConvertImageToThumbnailJPG-Methode verwendet zur Vereinfachung Klassen aus dem System.Drawing-Namespace. Die Klassen in diesem Namespace wurden jedoch für den Einsatz mit Windows Forms entwickelt. Sie werden nicht für die Verwendung in einem Windows- oder ASP.NET-Dienst unterstützt. Weitere Informationen zu Bildverarbeitungsoptionen finden Sie unter Dynamic Image Generation (Dynamische Imageerstellung) und Deep Inside Image Resizing (Ausführliche Informationen zur Bildgrößenanpassung).

Problembehandlung

Falls bei der Ausführung der Anweisungen in diesem Tutorial Probleme auftreten, finden Sie hier einige gängige Fehler und Ansätze zu deren Lösung.

ServiceRuntime.RoleEnvironmentException

Das RoleEnvironment-Objekt wird von Azure bereitgestellt, wenn Sie eine Anwendung in Azure ausführen oder den Azure-Serveremulator lokal verwenden. Wenn Sie diesen Fehler bei der lokalen Ausführung erhalten, vergewissern Sie sich, dass Sie das ContosoAdsCloudService-Projekt als Startprojekt gesetzt haben. Mit dieser Einstellung wird das Projekt mit dem Azure Compute Emulator ausgeführt.

Die Anwendung verwendet die Azure-Rollenumgebung z.B. zum Abrufen der Verbindungszeichenfolgen aus den CSCFG-Dateien. Diese Ausnahme kann also auch durch eine fehlende Verbindungszeichenfolge verursacht werden. Stellen Sie sicher, dass Sie die StorageConnectionString-Einstellung sowohl für die lokale als auch für die Cloudkonfiguration im ContosoAdsWeb-Projekt erstellt haben und dass Sie beide Verbindungszeichenfolgen für beide Konfigurationen im ContosoAdsWorker-Projekt erstellt haben. Mit einer Alles durchsuchen-Suche nach StorageConnectionString in der gesamten Lösung sollten Sie die Zeichenfolge neunmal in sechs Dateien finden.

Port xxx kann nicht überschrieben werden. Neuer Port unterhalb des zulässigen Mindestwerts 8080 für das HTTP-Protokoll

Versuchen Sie, die Portnummer für das Webprojekt zu ändern. Wählen Sie mit der rechten Maustaste das ContosoAdsWeb-Projekt, und wählen Sie Eigenschaften. Wählen Sie die Registerkarte Web, und ändern Sie die Portnummer in der Einstellung Projekt-URL.

Eine weitere Möglichkeit zur Behebung dieses Problems finden Sie im nächsten Abschnitt.

Sonstige Fehler bei der lokalen Ausführung

Standardmäßig verwenden neue Clouddienstprojekte den Azure-Serveremulator Express, um die Azure-Umgebung zu simulieren. Azure Compute Emulator ist eine abgespeckte Version der Serveremulator-Vollversion. Unter bestimmten Umständen kann es passieren, dass die Vollversion funktioniert und die Express-Version einen Fehler verursacht.

Um das Projekt mit der Emulator-Vollversion zu verwenden, klicken Sie mit der rechten Maustaste auf das ContosoAdsCloudService-Projekt, und wählen anschließend Eigenschaften. Wählen Sie im Fenster Eigenschaften die Registerkarte Web, und wählen Sie das Optionsfeld Emulator-Vollversion verwenden.

Um die Anwendung mit der Emulator-Vollversion zu verwenden, müssen Sie Visual Studio mit Administratorrechten öffnen.

Nächste Schritte

Die Contoso Ads-Anwendung wurde für dieses Tutorial bewusst einfach gehalten. Sie implementiert beispielsweise keine Abhängigkeitsinjektion oder das Repository und die Arbeitsmustereinheit. Sie verwendet keine Schnittstelle für die Protokollierung, sie verwendet keine EF Code First Migrationen, um Datenmodelländerungen oder EF-Verbindungsresilienz zu verwalten, um vorübergehende Netzwerkfehler zu verwalten usw.

Weitere Informationen zur Entwicklung für die Cloud finden Sie unter Erstellen von Cloud-Apps mit Azure.

Weitere Informationen finden Sie in den folgenden Ressourcen: