Entwickeln mit . NET und Azure Storage Services | Trevoir Williams | Skillshare
Suchen

Playback-Geschwindigkeit


1.0x


  • 0.5x
  • 0.75x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Entwickeln mit . NET und Azure Storage Services

teacher avatar Trevoir Williams, Jamaican Software Engineer

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Einführung

      0:34

    • 2.

      Azure Blob Storage

      5:33

    • 3.

      Tabellen- und Warteschlangenspeicher verstehen

      2:58

    • 4.

      Ein Azure Storage-Konto erstellen

      4:41

    • 5.

      Azure Storage Emulator

      1:36

    • 6.

      Speicherkontenverwaltung

      11:35

    • 7.

      Storage Explorer

      1:17

    • 8.

      Übersicht über Webanwendungen

      1:22

    • 9.

      Erstellen und Einrichten . NET Core Project

      4:12

    • 10.

      Table Storage Service hinzufügen

      10:21

    • 11.

      Controller und Ansichten erstellen

      11:57

    • 12.

      Testtabelle Storage CRUD

      4:23

    • 13.

      Blob Upload Service hinzufügen

      15:12

    • 14.

      Blob Service-Funktionen

      13:03

    • 15.

      Queue Service hinzufügen

      6:10

    • 16.

      Test Queue Service

      2:07

    • 17.

      Protokolle und Dienste-Aufrufe

      1:47

    • 18.

      Queue Message Reader einrichten

      11:16

    • 19.

      Code-Bereinigung und Optimierung

      13:19

    • 20.

      Schlussbemerkung

      1:43

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

9

Teilnehmer:innen

--

Projekt

Über diesen Kurs

Dieser umfassende Kurs "Entwickeln mit . NET and Azure Storage Services," richtet sich an Softwareentwickler, die ihre Fähigkeiten beim Erstellen und Verwalten moderner Anwendungen mit Microsofts verbessern möchten. NET und Azure Storage Services. Indem du in reale Szenarien und Best Practices eintauchst, erwerben die Schüler das Wissen und die Erfahrung, die sie benötigen, um das volle Potenzial dieser leistungsstarken Technologien zu nutzen.

Während dieses praktischen Kurses erkunden die Teilnehmer verschiedene Azure-Speicherdienste wie Blob Storage, Table Storage und Queue Storage, und lernen, wie sie in sie zu integrieren. NET-Anwendungen. Die Schüler werden mit Microsoft vertraut sein, wenn sie robuste, cloudfähige Anwendungen aufbauen, konfigurieren und bereitstellen. NET Framework, C# und Azure Storage Services.

Triff deine:n Kursleiter:in

Teacher Profile Image

Trevoir Williams

Jamaican Software Engineer

Kursleiter:in
Level: Intermediate

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

Transkripte

1. Einführung: In diesem Modul betrachten wir es als Ihre Speicherkonten. An diesem Montag werden wir uns die Angebote für Azure-Speicherkonten ansehen. Wir werden uns Blob Storage, Table Storage , Queue Storage ansehen. Und letztendlich werden wir eine Lösung entwickeln, die mit jeder dieser Komponenten von Azure Storage interagiert. Also werden wir wie immer weitermachen unsere Lager - oder Kegel erstellen. Schauen Sie sich die verschiedenen Optionen und erkunden Sie alle Nuancen und finden Sie heraus, wie Sie diese Angebote in unsere eigenen Lösungen integrieren können . Also bleib dran. Das wird ein lustiges Modul. 2. Azure Blob Storage: Zu Beginn schauen wir uns zunächst die Azure Blob-Speicherangebote an. Azure Blob Storage ist jetzt ein cloudbasierter Dienst zum Speichern unstrukturierter Daten wie Textdateien, Bilder, Videos usw. Es ist eine skalierbare, sichere und sehr kostengünstige Lösung für die Speicherung großer Datenmengen. Und es unterstützt Sicherheitsfunktionen wie Verschlüsselung, Authentifizierung und Autorisierung. Es gibt eine integrierte Integration für Azure AD und Ihre Daten werden sowohl bei der Übertragung als auch bei der Speicherung verschlüsselt. Daten kann überall auf der Welt über HTTP- oder HTTPS-Protokolle zugegriffen werden , was sie zu einem geeigneten Kandidaten für CDN-Sachen macht. CBN, diese Buchstaben bedeuten Content Delivery Network. Aufgrund dieser Flexibilität ist Blob Storage dafür perfekt geeignet. Integrieren oder Erstellen von Apps zur Unterstützung des Blob-Speicherangebots ist sehr einfach, wenn Sie Dotnet, Ruby, Java, Python und mehrere andere Frameworks verwenden . Sie können jederzeit nachschauen, ob das entsprechende Framework als Referenz verfügbar ist . Aber natürlich sind es die Punktzahlen der Dotnet-Entwickler und damit haben wir alles im Griff. Jetzt wird es häufig für Szenarien verwendet, in denen wir Bilder oder Dokumente direkt an den Browser senden möchten . Wir müssen den verteilten Zugriff auf eine Reihe von Dokumenten erleichtern . Wenn Sie Inhalte wie Video und Audio streamen möchten, wenn Sie Protokolldateien speichern möchten und zwar kontinuierlich, in diese Protokolldateien. Oder wenn wir Daten für Backup, Disaster Recovery und Archivierung speichern möchten . Wenn Sie sich für Datenwissenschaft und Big Data interessieren, werden Sie feststellen, dass es ein Angebot namens Azure Data Lake Storage Gen2 gibt , Microsofts Big-Data-Analyselösung für die Cloud für Unternehmen . Dies bietet ein hierarchisches Dateisystem sowie die Vorteile des Blob-Speichers. diesen Vorteilen gehören die Tatsache, dass es kostengünstig ist, über eine gestufte Speicherverfügbarkeit, hohe Konsistenz und Disaster Recovery-Funktionen verfügt. Jetzt haben wir gerade die Speicherstufen erwähnt. Es gibt also drei Arten von Speicherebenen. Die erste, die wir uns ansehen, ist diese Hot-Hot-Storage-Ebene, die für Datenanalysten verwendet wird , auf die häufig zugegriffen wird. Sie werden sehen, dass dies die teuerste Option ist. Also, wenn Sie wissen, dass Sie immer zum Blob-Speicher gehen , um auf diese Datei zuzugreifen, vielleicht Videos, die gestreamt werden, Audio, das gestreamt wird. Dann würden Sie es auf der Hot-Storage-Tier haben wollen. Dann haben wir die coole Speicherebene, die für Daten verwendet wird, auf die weniger häufig zugegriffen wird. Und natürlich ist es etwas günstiger als Hot, da der Traffic nicht gegen die Datei oder die Dateien gerichtet ist . Wenn Sie also versuchen, auf eine Datei zuzugreifen, kann das Laden der Datei etwas länger dauern. Aber das ist natürlich besser für Dateien, die langfristig gespeichert werden sollen und mit denen nicht so viel interagiert werden soll. Dann haben wir die Archivierungsebene, und zwar für Daten, auf die selten zugegriffen wird. Dies gilt also für Dateien, bei denen Organisationen im Allgemeinen Dateien oder Aufzeichnungen bis zu sieben Jahre lang aufbewahren müssen . Ordnung, Sie möchten also Dateien archivieren, vielleicht können Sie sie nach dem dritten Jahr in den Archivspeicher legen , weil Sie nicht mehr so oft auf sie zugreifen werden. Und wenn Sie zu Access gehen, wird es viel länger dauern. Es muss diese Datei oder diesen Blob rehydrieren, dann würde es ihn zurückbringen. Das wird natürlich für erweiterte Backups verwendet und ist die kostengünstigste Option. Jetzt hat ein Speicher-Up-Dolon mindestens zwei Hauptkomponenten , die Sie in allen anderen Speichertypen sehen. Aber da wir über Blobs sprechen, werde ich die Entzündung im Verhältnis zu Blobs irgendwie anpassen. Das erste, was Sie haben, sind die tatsächlichen Konten. Dies bietet nun einen Namespace in Azure für Ihre Daten, und jedes Objekt, das ich verwende in Azure Storage gespeichert ist, hätte eine Adresse, die diesen eindeutigen Kontonamen enthält. Dann haben wir den Container und unser Container organisiert alle Blobs ähnlich wie Sie es von einem Dateisystem wie Windows oder Linux erwarten würden einem Dateisystem wie , um Ihre Dateien zu organisieren. Diese Art von Ordnerstrukturhierarchie steht Ihnen in unserem Container zur Verfügung. Dann stellt der Blob eine physische Datei dar, die im Container gespeichert ist. Es gibt ein Diagramm, das diese Hierarchie zeigt. Es gibt verschiedene Arten von Blobs. Blob ist ein Blob, ich meine, es ist eine Datei, die in diesem Speicher oder in diesen Kegeln gespeichert ist, aber dann müssen verschiedene Blobs aus verschiedenen Gründen unterschiedlich behandelt werden . Der erste, den wir haben, ist ein Blockblob , der wahrscheinlich der häufigste ist. Wir verwenden das, um Text- oder Binärdaten zu speichern. Und es besteht aus Datenblöcken, die bis zu 190,7 Trilobiten speichern können , nicht Terror, sondern Tilly-Bytes. Dann müssen wir Blobs anhängen. Nun, das hat Blöcke, die den Blockblobs ähnlich sind. Nun, sie sind für den Append-Betrieb optimiert. Das wäre also ideal für ein Szenario, in dem wir Daten von einer virtuellen Maschine oder in Ihrem App Service protokollieren müssen . Wenn du dich erinnerst, als wir gerade beim App Service Logging waren, hätten wir uns dafür entscheiden können, uns in einem Blob zu loggen, oder? Das würden wir also verwenden. Es würde einen Append Blob für diese Situation bereitstellen. Der nächste Typ wären Seitenblobs. Seitenblobs speichern Direktzugriffsdateien mit einer Größe von bis zu 8 KB Diese werden im Allgemeinen als virtuelle Festplattendateien für unsere virtuellen Maschinen in Azure verwendet virtuelle Festplattendateien . Als Nächstes schauen wir uns das als Ihren Tabellenspeicher an. 3. Tabellen- und Warteschlangenspeicher verstehen: Nun, Ihr Tabellenspeicher ist ein Dienst, nichtrelationale oder unstrukturierte Daten speichert, die auch als SQL bezeichnet werden. Und es ist wieder ein Cloud-Dienst, uns die Speicherung von Schlüsselattributen in einem schemalosen Design bietet . Jetzt hätten Sie gesehen, dass als Ihr Tabellenspeicher referenziert wird, wenn wir uns andere Cosmos DB ansehen. Und es ist eine der APIs , die Azure Cosmos DB unterstützt. Wenn Sie also mit Azure-Speichertabellen oder Table Storage beginnen Azure-Speichertabellen oder Table Storage und dann für mehr Speicher und mehr Redundanz migrieren müssen , können Sie zu Cosmos DB wechseln . Aber das ist ein ausgezeichneter Anfang. Wenn Sie sich Ihrer Datenanforderungen nicht sicher sind und in der Lage sein müssen , sich an neue Anforderungen in Bezug auf oder Details anzupassen, ist dies eine hervorragende Lösung Anfang, da sie schemalos sich daher immer Ihren Bedürfnissen anpassen kann . Der Zugriff ist jetzt schnell und kostengünstig und im Allgemeinen günstiger als bei anderen SQL-Angeboten für ähnliche Datenmengen. Sie können dies auch in Betracht ziehen, wenn Sie mit unserer relationalen oder Azure SQL-Instanz beginnen möchten und wissen, dass Sie nicht so viele Daten im Voraus speichern werden , dass Sie möglicherweise mit Tabellen beginnen und dann hochfahren. Aber natürlich werden all diese Dinge Ihre Entscheidungen beeinflussen. Der nächste Speichertyp, den wir haben, ist der Queue-Speicher. Dies ist jetzt ein Dienst zum Speichern großen Anzahl von Nachrichten. diese Nachrichten kann überall durch authentifizierte Anrufe über HTTP oder HTTPS zugegriffen werden. Wenn Sie Ihren Warteschlangenspeicher einrichten, erhalten Sie im Wesentlichen einen Link , über den Sie den Speicher abonnieren und Nachrichten aus der Warteschlange lesen und schreiben können . Warteschlangennachrichten können bis zu 64 KB groß sein. Und je nach Kapazitätslimit Ihres Speichers oder Ihrer Kegel können Sie so viele Nachrichten wie möglich erhalten. Allgemein bekannt als Ihre Cues, Speicher oder Warteschlangen im Allgemeinen, werden verwendet, um einen Rückstand an Arbeitselementen zu erstellen. Der Prozess erfolgt asynchron. Das heißt, wenn Sie beispielsweise eine Anwendung erstellen, die eine E-Mail senden muss, möchten Sie, dass die Anwendung angehalten wird, während Sie eine Verbindung zum E-Mail-Server herstellen, den Inhalt des E-Mail-Versands, der E-Mail herausfinden , warten, bis sie erfolgreich war, dann versendet, und dann kann der Benutzer fortfahren, vielleicht auch nicht. IQ würde es Ihnen also ermöglichen , diese Informationen weiterzugeben und dann mit Ihrer Bewerbung fortzufahren , diese Informationen weiterzugeben . Und dann hätten Sie einen anderen Dienst , der diese Nachricht wahrscheinlich aus der Warteschlange nimmt und die E-Mail irgendwann versendet , sodass wir, die Benutzererfahrung , nicht beeinträchtigt werden. Und das ist nur ein Beispiel. Warteschlangen können auf verschiedene Weise verwendet werden, insbesondere wenn es sich um Microservices handelt. Aber wir werden einige Beispiele mit diesem Zeug durchgehen . Wir sehen uns also in der nächsten Lektion, in der wir anfangen. 4. Ein Azure Storage-Konto erstellen: Jetzt erstellen wir von unserem Portal aus ein neues Speicherkonto. Lassen Sie uns also gleich loslegen. Wir gehen zu unseren Pillen über und wählen Ressource erstellen. Und von hier aus werden wir nach Speicherplatz suchen. Ich kann also einfach Speicher eingeben, Enter drücken und okay, lassen Sie uns einfach das Autocomplete-Speicherkonto verwenden. Wir wollen ein Lager mit Kegeln, also wählen wir das aus und erstellen von hier aus, lassen Sie uns unser Formular wie gewohnt ausfüllen. Da es sich bei diesem Speicher also um einen von Microsoft verwalteten Dienst handelt, Blob Storage Data Lake Gen2 und Azure Files umfasst. Wir haben nicht wirklich über Azure Files gesprochen, aber das werde ich ein bisschen erklären. Warteschlangen und Tische. Nein, es ist wichtig, dass Sie diese Einstellungen richtig vornehmen, da einige Dinge je nach Stufe und Art des von Ihnen bereitgestellten Speicherkontos verfügbar sind. Als Erstes wählen Sie wie gewohnt die Warenkorb-Ressourcengruppe aus. Also lasst uns weitermachen und das tun. Und dann für den Namen des Speichers werde ich sagen, da Sie ein Pferd sind, werde ich natürlich die beste Zone auswählen , die meinen Lösungsbedürfnissen entspricht. Und dann können wir uns eine Aufführung aussuchen. Wollen wir also den Standard, der der empfohlene ist, oder wollen wir Premium, vier Szenarien, die eine sehr geringe Latenz erfordern. Für diese Demo werden wir also den Standard beibehalten. Wenn Sie andere Bedürfnisse haben, wählen Sie natürlich den passenden aus. Auch für die Redundanz. Ich entscheide mich einfach für lokal redundant. Und Redundanz, etwas, das Sie je nach Bedarf auch bei jedem Service immer wieder berücksichtigen sollten bei jedem Service immer wieder berücksichtigen . Also wähle ich lokal redundanten Speicher. Fahren Sie mit der nächsten Option fort. Ich lasse alles , was angekreuzt war, ich lasse es angekreuzt. Und wenn wir dann einige Big-Data-Operationen durchführen würden , könnten wir einen Data Lake Gen2 für den hierarchischen Namespace wählen, da einige Big-Data-Operationen durchführen würden , könnten wir einen Data Lake Gen2 für den hierarchischen Namespace wählen einen Data Lake Gen2 für wir keine Big-Data-Operationen durchführen, also lasse ich das in Ruhe. Und wenn wir dann nach unten scrollen, können wir hier sehen, wollen wir das Warme oder das Kalte? Denken Sie also an Hotkeys für häufig aufgerufene tägliche Nutzungsszenarien. Vielleicht wie CDN. Vielleicht speichert die gesamte Organisation dort die gesamte Organisation Dateien und liest und schreibt. Im Gegensatz zum coolen Speicher, in dem Sie wahrscheinlich Dateien ablegen würden auf die hin und wieder zugegriffen wird. In Ordnung. Dann haben wir Azure-Dateien. Ihre Dateien sind also eine Bereitstellung des Speicherkontos , das uns einen vollständig verwalteten Dateiaustausch in der Cloud ermöglicht . Und sie sind über Industriestandards, Server Message Block - oder SMB-Protokolle, Netzwerkdateisystem - oder NFS-Protokolle oder auch nur eine RESTful-API zugänglich Server Message Block - oder SMB-Protokolle, Netzwerkdateisystem - oder NFS-Protokolle . In einfacherem Englisch. Ihre Dateien wären wie ein in Cloud Filesharing , das Sie für Ihr Unternehmen einrichten könnten um das lokale Shear zu ersetzen. Da wir die gemeinsame Nutzung von Dateien nicht ermöglichen, werde ich große Dateifreigaben nicht zulassen oder aktivieren. Und dann können wir zum Netzwerken übergehen und alles, was da ist, der Fehler ist in Ordnung. Datenschutz. Hier können wir also Optionen für den Umgang mit den Daten einrichten . Ich werde die Standardwerte angekreuzt lassen, aber ich ermutige Sie, die einzelnen Werte durchzulesen, um zu sehen was darin steht, und diese Werte je nach Urinbedarf zu ändern . Natürlich. Wir können auch die Versionsverfolgung für unsere Blobs aktivieren. Wenn Sie mehrere Dateien haben, mehrere Versionen einer Datei haben, wird dieses Protokoll geführt. Und Sie können einen Change-Feed aktivieren, nur für den Fall, dass Sie einen Dienst haben , der den Blob-Status abonnieren muss, okay, nun, diese Änderung, ich muss eine Aktion auslösen. sind also Dinge, die Sie Betracht ziehen können, wenn Sie einige andere Workflows auf der Grundlage der Blobs und Aktivitäten automatisieren möchten einige andere Workflows auf der Grundlage , die für Ihre Blobs ausgeführt werden. Wenn wir nun zur Verschlüsselung übergehen, habe ich bereits erwähnt, dass Daten sowohl bei der Speicherung bei der Übertragung verschlüsselt werden. Sie zeigen Ihnen also nur die Art der Verschlüsselung. Ich lasse die Standardeinstellungen dort und dann können wir auswählen, welche Dienste vom Kunden verwaltete Schlüssel unterstützen, und ich belasse diese als Standard. Als nächstes wären also wieder unsere Tags dran. Was? Ich springe einfach rüber, um es zu überprüfen. Und sobald diese Überprüfung erfolgreich abgeschlossen ist, können wir unser Speicherkonto erstellen. Sobald die Bereitstellung abgeschlossen ist, können wir auf Gehe zur Ressource klicken. Und sobald wir dort sind, werden wir sehen, dass unser Blob-Speicher - oder Speicherkonto erstellt wird. Und von hier aus können wir verschiedene Dinge tun. Wenn wir also zurückkommen, werden wir die verschiedenen Optionen untersuchen und Hold kann mit den verschiedenen Komponenten unseres Speicherkontos interagieren . 5. Azure Storage Emulator: Erwähnenswert ist nun , dass wir Zugriff auf einen lokalen Emulator für Azure-Speicher haben , der Azurit heißt. Und das ist Open Source und plattformübergreifend. Sie haben also mehrere Installationsoptionen und Sie werden hier sehen dass es plattformübergreifende Unterstützung unter Windows, Linux und macOS bietet . Und es ermöglicht uns freien lokalen Zugriff auf eine Umgebung zum Testen von Blob Storage, Queue-Storage und Tabellenspeicher. Also all die Aktivitäten, die wir im Begriff sind , mit all diesen Diensten zu tun , könnten wir tatsächlich durchführen, wenn wir unsere Bereitstellung implementieren, diesen lokalen Emulator für diese Dienste. Das Einrichten der Dienste ist jetzt relativ einfach. Wenn Sie Visual Studio 2022 verwenden, erhalten Sie es automatisch. Wenn Sie Visual Studio Code verwenden, können Sie ihn für Erweiterungen erhalten. Wenn Sie npm verwenden, können Sie einen Befehl ausführen, wenn Sie Darker verwenden, als Sie das Image abrufen und installieren können. Und Sie können jederzeit direkt zum Azurite Git Repo, Repo gehen und es klonen. Und um es auszuführen, haben Sie mehrere Möglichkeiten, mit Azurite zu interagieren, wenn Sie Visual Studio, Visual Studio Code usw. verwenden. Sie können also diese Dokumentation lesen, wenn Sie nur eine lokale Umgebung einrichten möchten. Und dann können Sie weitermachen und auf sie zugreifen. Wissen Sie, wir werden den Storage Explorer im Laufe dieses Moduls etwas genauer untersuchen den Storage Explorer im . Aber ich wollte nur darauf hinweisen, um auf die lokale Umgebung zuzugreifen und Interaktionen mit den verschiedenen Komponenten eines Speicherkontos zu simulieren . 6. Speicherkontenverwaltung: In diesem Dashboard können Sie also sehen , dass mehrere Optionen , die wir möglicherweise nicht aktiviert oder aktiviert haben und die wir wahrscheinlich später deaktivieren wollten , hier geändert werden können. Wenn ich also die Standardzugriffsebene von heiß auf kalt ändern möchte, könnte ich einfach darauf klicken und das dann ändern. Bestimmte Dinge können nicht geändert werden, oder Sie können einfach aufspringen und die Leistung von Standard oder Premium ändern. Sie könnten jedoch einige andere Optionen ändern. Also entschied er später, oder die Organisation entschied, dass sie große Dateien zulassen muss. Und Sie werden hier sehen , dass es eine schnelle Speicherung von bis zu 100 KB unterstützt . Du könntest weitermachen und das tun. Könnte diese Aktienkurse hier auch ändern, aber wir lassen es vorerst heiß. Später können wir die Ressource entweder entfernen oder sie auf eine coole Stufe herabsetzen. Zurück in unserem Übersichtsbereich sehen wir, dass wir die Möglichkeit haben, es in einem Explorer zu öffnen. Wenn wir auf Open Explorer klicken, werden Sie sehen, dass Sie es herunterladen können, Sie Ihre Dateien und Container und alles andere von Ihrem Computer aus verwalten können. Wir können auch einen Speicherbrowser verwenden. Wir können also auf den Speicherbrowser klicken und dadurch gelangen wir zu ausreichend ähnlichen Oberfläche die uns die Anzahl der Container, Dateifreigaben, Tabellen und Warteschlangen im System anzeigt . Wir können auch weitermachen und mit diesen Komponenten unterbrechen. Also kann ich hier einen neuen Container erstellen. Und ich nenne diesen Container. Ist natürlich Container. Ich kann die Zugriffsebene festlegen, ob sie privat sein soll, damit niemand sonst darauf zugreifen soll, oder Blob für Lesezugriff nur für Blobs oder Container mit anonymem Leseschreibzugriff für Continuous und Blobs. Lass das jetzt privat. Und im Voraus kann ich den Verschlüsselungsumfang und die Unveränderbarkeitsunterstützung festlegen . Ich mache einfach weiter und klicke auf Erstellen. Sobald dieser Blob oder dieser Container erstellt wurde , kann ich zum Container gehen und dann ein Verzeichnis hinzufügen oder eine Datei hochladen. Denken Sie jetzt daran, dass der Container der Ort ist, an dem die Dateien wirklich abgelegt werden, und er versucht, Ihnen diese hierarchische Ansicht der Dateien zu geben und Ordner oder Verzeichnisse ohne Anführungszeichen zu zitieren, wenn Sie müssen. Also kann ich ein Verzeichnis hinzufügen und ich nenne es neues Verzeichnis. Du, ist es ein grober Baum? Da haben wir es. Dann kann ich in diesem provisorischen Verzeichnis tatsächlich alle Verzeichnisse zusammenfügen, kann ich in diesem provisorischen Verzeichnis tatsächlich alle Verzeichnisse zusammenfügen wenn ich will, oder ich kann einfach hochladen. Beim Hochladen kann ich also wählen, ob ich sie überschreiben möchte, ob sie bereits existieren Ich kann Dateien per Drag & Drop ziehen oder nach Dateien suchen. Und wenn ich dann auf „Erweitert“ schaue, kann ich die Art des Blobs auswählen, den ich hochlade. Es gibt also einen Block Blob, Page Blob oder Append Blob. Ich ändere das generell nicht , weil ich wirklich nur Blockblobs hochlade. Oder Sie können die Blockgröße wählen , wenn Sie auf Stereotypen zugreifen möchten. Wenn es also heiß, cool oder archiviert und wir einen Ordner hochladen können, können wir verschiedene Dinge tun. Also mache ich einfach einen einfachen Upload. Und ich lade gerade ein zufälliges PDF hoch, das ich auf meinem Computer gefunden habe. Nichts allzu Ausgefallenes. Und da haben wir es. Ich habe gerade meine erste Blob-Datei hochgeladen und sie ist Hot Access. Natürlich kann ich weitermachen und es bearbeiten. Ich kann eine URL abrufen, ich kann ein SAS-Token generieren. Und wir werden uns all diese ansehen und was sie bedeuten. Und ich kann sogar löschen. Denken Sie jetzt daran, dass dadurch das sanfte Löschen aktiviert wurde. Wenn ich das lösche, kann ich tatsächlich zurückgehen und aktive und gelöschte Blobs anzeigen und das bringt alles zurück , was ich gelöscht habe. Es wird mir zeigen und es hat mir gezeigt , wie lange es aufbewahrt wird. Und dann rate mal was? Ich kann es tatsächlich ON löschen. Wenn ich mit der rechten Maustaste klicke, kann ich auf Löschen klicken und es wird wiederhergestellt. Das ist also eine nette kleine Ausfallsicherheit für den Fall wir versehentlich Dateien entfernen. Nein, denken Sie daran, dass Fast Shares etwas mehr Zeit in der Einrichtung erfordert, aber es ist eine hervorragende Möglichkeit, File Share von Ihrem lokalen Computer oder der Fascia Ihrer Organisation von den lokalen Servern zu verschieben File Share von Ihrem lokalen Computer oder Fascia Ihrer Organisation von und in die Cloud zu stellen. Dies ist besonders nützlich für Länder, die einen verteilten Zugriff auf dieselben Dateien benötigen. Ordnung, wenn Sie also einen privaten Dateiaustausch für unser verteiltes Setup mit vorhandenen Redundanzen wünschen In Ordnung, wenn Sie also einen privaten Dateiaustausch für unser verteiltes Setup mit vorhandenen Redundanzen wünschen, ist dies eine hervorragende Option für Sie. Gehen wir zu den Hinweisen über. Obwohl. Ich habe eine neue Warteschlange hinzugefügt und nenne das hier ein Pferd. F: Lassen Sie uns weitermachen und auf Okay klicken. Dann siehst du den Hauptteil der URL. Wir werden uns also bewegen, wenn wir mit der Entwicklung beginnen, uns die URL für unseren Blob-Container und die Blobs und alles andere anzusehen. Aber im Moment machen wir nur einen Überblick über das Speicherkonto. Von dieser Warteschleifen-URL aus kann ich diesen Skew also abonnieren und Nachrichten in die Warteschlange stellen. Ich kann jetzt Nachrichten aus der Warteschlange lesen und wir sagen, Nachricht ist, was genau meinen wir? Wenn ich die Warteschlange auswähle, kann ich auf Nachricht hinzufügen klicken. Also, wenn ich eine Nachricht hinzufüge und sage, dass dies eine zufällige Testnachricht ist . Und ich kann die Zeitspanne festlegen, sie sollte ablaufen. also nach sieben Tagen Wenn diese Nachricht also nach sieben Tagen nicht verarbeitet wird, entfernen Sie sie. Natürlich werden sich Ihre Bedürfnisse auch hier unterscheiden, sodass Sie den auswählen, der Ihren Bedürfnissen entspricht . Sie könnten auch sehen, dass die Nachricht immer abgelaufen ist. Sobald eine Nachricht also unter Q entspricht, löschen Sie sie niemals, bis sie verarbeitet wurde. In Ordnung? Und dann würdest du Encodieren sagen, das würden wir tun wollen. Ich klicke. Okay. Wenn ich also auf Okay klicke, haben wir jetzt eine Nachricht in dieser Warteschlange. Und wieder einmal, wenn wir Nachrichten sagen, sprechen wir von Daten , die verarbeitet werden müssen. Diese Nachricht ist also, wie Sie sehen können, wirklich nur Text. Und ich habe versehentlich dieselbe Nachricht zweimal hinzugefügt. Es dauert wirklich nur, okay, das heißt, das könnte ein Satz sein. Es könnte ein Hort sein. Es könnte sich sogar um ein JSON-Objekt handeln, was eine sehr beliebte Methode ist Daten wie Datenkörper auf Hinweise zu transportieren. Was hier also passieren könnte, ist, dass Sie einen Block von JSON- oder JSON-Objekten als Sticks senden könnten einen Block von JSON- oder JSON-Objekten . Und dann können Sie einen Drittanbieterdienst oder einen anderen Dienst verwenden einen Drittanbieterdienst oder , um diese JSON-Nachricht tatsächlich zu verarbeiten , in der alle für einen Vorgang erforderlichen Informationen zur Verfügung stehen. Verschiedene Dinge und verschiedene Möglichkeiten, wie Sie Hinweise verwenden könnten. Auch hier besteht der Hauptnutzen von Warteschlangen darin, Prozesse auszulagern , die zu Verzögerungen bei der tatsächlichen Anwendungslaufzeit führen können . Es ist also schneller, das E-Mail-Beispiel erneut zu verwenden, es ist schneller, den E-Mail-Text zu übergeben , dieses JSON-Objekt mit den E-Mail-Adressen des Absenders an die Empfänger hätte sein können und dann der Nachrichtentext und alles andere es hatte, in die Warteschlange gestellt und dann mit der Anwendung fortgefahren werden kann. Und dann wird diese Nachricht im Hintergrund irgendwann aus der Warteschlange genommen und gesendet. Wenn ich ventral sage, meine ich, es könnte passieren. Sehen Sie sich die gleiche Zeit an, es kann 20 E-Mails später passieren , wenn Sie Hunderte von Benutzern haben , die E-Mails im System versenden, Sie möchten nicht, dass Hunderte von Benutzern und der eine auf das System warten. Im weiteren Verlauf dieses Kurses werden wir uns einige Beispiele auf verschiedene Arten ansehen . Das ist alles, was wir der Warteschlange hinzufügen . Und natürlich können wir die Warteschlange leeren und wir können auch eine Nachricht senden. Also könnte ich auf diese Nachricht klicken und dq sagen. Jetzt wären die nächsten Tische. Table Storage ist wieder einmal ein schemaloses Design. Also kann ich auf Tabelle hinzufügen klicken und ihr einen Namen geben. Und wo auch immer Sie sehen, dass ich keine Bindestriche verwende, weil bestimmte Dienste strengere Namenskonventionen haben und andere, sodass einige von ihnen Bindestriche zulassen, andere nicht. Sie werden es also im Laufe der Zeit herausfinden. Es wird Sie immer informieren, wenn Sie die Namenskonvention verstoßen. Aber wenn ich auf Okay klicke , wird eine neue Tabelle erstellt. Und dann erhalten wir wieder eine URL für diese Tabelle, über die wir das Eingeben und Lesen von Daten aus der Tabelle abonnieren können . Und wenn ich dann auf die Ressource selbst klicke, haben wir ein sehr ähnliches Layout wie bei der Verwendung von Azure Cosmos DB. Wir haben Partitionsschlüssel, wir haben Zeilenschlüssel und es wird einen Zeitstempel haben. Wenn ich also auf Entität hinzufügen klicke, habe ich im Grunde die Möglichkeit, einen Partitionsschlüssel und einen Zeilenschlüssel anzugeben, und ich kann entsprechend andere Eigenschaften hinzufügen. In Ordnung, also lass uns weitermachen und eine neue Entität hinzufügen. Lassen Sie uns nun sagen, dass ich einige Lebensmittel lagern wollte . Und was ich hier tun werde, ist nachzusehen, dass der Partitionsschlüssel die Kategorie des Produkts ist. Also, wenn ich etwas lagere, das Molkereiprodukte ist und dann, sagen wir, die Eigenschaft Nummer eins ist der Preis. Und dann kann ich den Datentyp wählen. Der Preis wäre also doppelt so hoch. Nehmen wir an, es kostet 2,50$. Und dann wäre der nächste der Name des Artikels. Ich weiß nicht, warum ich die Presse vor den Namen stelle, aber sagen wir einfach , das ist Milch. Und dann einfügen. Jetzt hätte ich einen neuen Zeilenschlüssel generieren können. Ich hätte sagen können, dass ein Bogen eine GUID verwendet hätte. Ich habe es absichtlich leer gelassen, aber ich zeige Ihnen nur die Punkte, an denen wir unseren Partitionsschlüssel und Zeilenschlüssel eingeben können , aber dann können wir so viele andere Spalten eingeben und Spaltenwert-Peers sind Schlüsselwertpaare Schlüsselattribute, wie wir benötigen und wie gesagt, Ihre Bedürfnisse wachsen. Also nochmal die Daten, damit ich eine weitere Entität hinzufügen kann, bei der ich vielleicht später festgestellt habe, dass ich mehr Immobilien als nur Preis und Namen speichern muss , oder? Also, wenn es diesmal sagen wir Heftklammer wäre, und dann geben wir ihm diesmal einen Zeilenschlüssel. Und dann ist der Preis zehn. Sagen wir einfach, der Name ist Brot. Und was bräuchten wir noch, um das zu lagern? Vielleicht möchte ich, dass es tatsächlich in eine Kategorie eingeordnet wird. Auch das ist ein Grundnahrungsmittel. Vielleicht das Verfallsdatum. Ich denke mir nur die Sachen richtig aus. Denn auch hier werden sich Ihre Bedürfnisse unterscheiden. Das Verfallsdatum hat die Uhrzeit, oder? Sie wählen also den entsprechenden Datenwert und dann gebe ich ein Ablaufdatum ein und ich lösche einfach das letzte. Nehmen wir an, das war ein neuer Look. Wenn unser Bedarf steigt, wird die Anzahl der Spalten, die wir einfügen können, zunehmen R kann mit sehr geringen Auswirkungen zunehmen. Und das ist der Punkt, an dem kein Sequel-Aspekt entsteht. Es sieht also immer noch relational aus, aber wir haben immer noch den Vorteil dieses Schemallistendesigns. Damit ist unser Rundgang durch unser Speicherkonto abgeschlossen. Wenn wir zurückkommen, werden wir uns damit befassen, wie wir Lösungen entwickeln können , die mit diesen verschiedenen Komponenten interagieren. 7. Storage Explorer: Wenn Sie sich jetzt für den Storage Explorer entscheiden, erhalten Sie diese Visual Studio-Code-Slash-Grafiken, tut mir leid, so wie Sie es von Data Studio gewohnt sind. Zuallererst möchten Sie vielleicht unsere Kegel verwalten und sich entsprechend authentifizieren. Und sobald Sie authentifiziert sind, können Sie sich Ihr Lager oder Ihre Kegel genauer ansehen. Sobald Sie Ihre Authentifizierung geklärt haben, können Sie auf die verschiedenen Teile zugreifen. Also hier ist das Speicherkonto , das wir zuvor erstellt haben. Und noch einmal, wir können uns das genauer ansehen und uns verschiedene Dateifreigaben, die Hinweise, die Tabellen, all die Ressourcen ansehen, die wir uns zuvor angesehen haben. Möglicherweise sehen Sie sogar einige andere , die Sie im Browser-Explorer nicht gesehen haben. Also kannst du weitermachen und das tun. Und alle Optionen, die Sie im Browser hatten , sind auch hier verfügbar. Sie können also Ihre Dateien, Ihre Blobs, Ihre Ordner, alles hier verwalten . Und das ist noch besser für die Machine-zu-Machine-Verwaltung des Blob Storage. Ich denke also, dass es eine sehr gute Idee ist, den Storage Explorer zu bekommen . Und es macht die Verwaltung Ihres Speichers von Cones viel einfacher, als jedes Mal zum Browser gehen zu müssen. 8. Übersicht über Webanwendungen: Jetzt werden wir eine Web-App entwickeln, in der Sie die verschiedenen Komponenten verwenden , die uns der Speicher oder die Kegel zur Verfügung stellen. Unsere Idee für ein Webprojekt war es also , ein Anmeldeformular für Konferenzteilnehmer auszuhändigen. Wir werden asp.net, MVC verwenden. Dieses Mal haben wir die Razor-Seiten benutzt, du hast Blazer benutzt, wir werden MVC verwenden. Aber auch hier, sobald es Dotnet Core ist, werden die Konzepte übertragbar sein. wissen, was wir tun werden, ist Azure Table Storage zu verwenden, um das Register zu speichern, und auf Senden zu klicken. Wir werden diese Daten in diesem Tabellenspeicher speichern. Wir werden ihnen erlauben, ein Bild hochzuladen. Für diesen Bild-Upload verwenden wir den Azure Blob Storage. Okay, normalerweise würdest du es also lokal speichern, aber wir wollen nicht, dass es lokal auf dem Server gespeichert wird. Wir werden das als Ihren Blob-Speicher auslagern. Wir werden Azure Queue Storage verwenden , weil wir eine E-Mail versenden möchten. Also habe ich dieses Beispiel früher in diesem Abschnitt des Kurses verwendet . Senden einer E-Mail erfordert die Aktualisierung, um das einzufrieren, das zu erledigen und dann weiterzumachen. Also geben wir es einfach an die Warteschlange weiter. Und dann erstellen wir eine Konsolen-App, die einen Client simuliert, der die Warteschlange liest und dann die Nachricht oder die E-Mail-Daten aus der Warteschlange für den Versand verarbeitet . Also werden wir all diese Dinge tun, die uns bevorstehen. 9. Erstellen und Einrichten . NET Core Project: Mit derselben Lösung, die wir für den gesamten Kurs verwendet haben, wollte ich also für den gesamten Kurs verwendet haben, ein neues Projekt erstellen. Das ist natürlich optional. Wenn Sie jede Lösung in eine eigene Lösung aufteilen möchten, können Sie fortfahren. Und wieder verwende ich Visual Studio. Sie können auch mitmachen, wenn Sie Visual Studio Code verwenden. Also mach weiter und erstelle ein neues Projekt. Und dieses Mal werde ich eine MVC-Web-App verwenden. Also gebe ich bei der Suche einfach die Buchstaben MVC und wähle dann ASP Core Web up with Model View Controller. Als Nächstes nenne ich dieses eine MVC Storage Account Demo. Als Nächstes kann alles als Standard beibehalten werden. Und dann erstellen wir, wenn Sie die Terminologie für Visual Studio unter Linux oder Mac OS verwenden , können Sie zu Ihrem gewünschten Verzeichnis navigieren. Und dann kannst du Dotnet sagen, neues MVC. Und dann können Sie es in ein Verzeichnis mit dem Namen des Projekts ausgeben . Und dann können Sie weitermachen und die Eingabetaste drücken. Nun, da das Projekt erstellt wurde, lassen Sie uns fortfahren und einige der Bibliotheken hinzufügen , mit denen wir arbeiten müssen. Und natürlich kennen wir die verschiedenen Möglichkeiten, wie wir Bibliotheken hinzufügen können. Aber ich werde nur die Terminals verwenden, da das Terminal für alle funktioniert, egal ob Sie in Visual Studio oder Visual Studio Code sind. Also werde ich sagen, dotnet füge Pakete hinzu oder füge lieber Paket hinzu. Und dann ist das erste Paket, das wir hinzufügen , Azure Storage Blobs. Also können wir einfach die Eingabetaste drücken. Ordnung, und sobald das erfolgreich eingefügt wurde, lösche ich einfach den Bildschirm. Und dann fügen wir dieses Mal eine Nullpunkt-Speicherwarteschlange hinzu. Und dann fügen wir schließlich eine Nullpunkt-Datenpunkttabelle hinzu. In Ordnung, also dotnet füge das Paket als deine Datenpunkttabellen hinzu. Nachdem wir all diese Einstellungen vorgenommen haben, wir fortfahren und unsere Speicherverbindungszeichenfolge, Speicher- oder Doppelpunkt-Verbindungszeichenfolge hinzufügen . Ich gehe einfach rüber zu den App-Einstellungen, Jason, lass es mich verstecken, das Terminal, damit wir etwas mehr Platz bekommen. Und ich nenne einfach diese Speicherverbindungszeichenfolge. Und dann wird der Wert für unsere Speicherverbindungszeichenfolge von unserem Portal kommen. Also lasst uns zu unserem Portal springen. Und dann sind wir runtergesprungen , bis die Zugriffstasten bluten. Und dann wählen wir die Verbindungszeichenfolge aus. Also zeige ich einfach In die Zwischenablage kopieren , gehe zurück zu unserem Code und dann können wir das einfügen. Im. Da haben wir es. Meine Zwischenablage war also noch nicht primär. Das ist also unsere Verbindungszeichenfolge. Und ich werde einen neuen Ordner erstellen. Und dieser neue Ordner wird unser Datenmodell für die Speichertabellen speichern . Also nenne ich es einfach Daten. Gemäß unserer bereits etablierten Namenskonvention werden wir eine neue Klasse hinzufügen. Und ich rufe einfach diesen einen Teilnehmer an. Beachten Sie, dass wir die IT-Entitätsschnittstelle implementieren müssen, da wir Table Storage verwenden werden implementieren müssen, da wir . Die Teilnehmer werden also von Anfang an von einer Tabellenentität erben . Und das kommt zu uns aus unserer Klasse für Datentabellen. Und dann kann ich mithilfe von Kontrollpunkten die Schnittstelle implementieren. Das gibt uns jetzt diese spezifischen Spalten, oder? Denken Sie daran, dass diese Spalten da waren bevor wir mit dem Hinzufügen weiterer Attribute begonnen haben. In Ordnung, also kann ich das natürlich einfach aufräumen und sie B holen lassen, das ich bekomme und das Set, fertig. Und entfernen Sie all diese durch neue Throwns-implementierte Ausnahmen. Ordnung, also nachdem wir das bereinigt haben, lassen Sie uns fortfahren und unsere eigenen Eigenschaften hinzufügen. Also das hilft mir hier draußen. Ich habe also einen Namen und ich würde wahrscheinlich den FirstName vom Nachnamen trennen wollen . Und geben wir eine E-Mail-Adresse ein. Und was würden Sie sonst noch brauchen, um den Teilnehmer anzulocken? Lassen Sie uns vorerst damit arbeiten. Als unsere Anforderungen bedeutet CMS also, mehr zu setzen. Aber fangen wir damit an. 10. Table Storage Service hinzufügen: Lassen Sie uns nun unseren Table Storage Service konfigurieren. Also erstelle ich einen neuen Ordner und nenne diesen Dienst. Und hier werde ich eine neue Klasse erstellen. Und diese Klasse wird Table Storage Service heißen. Und während ich hier bin, werde ich hier nur eine kurze Anpassung vornehmen. Ich denke, ich werde das nur ein wenig qualifizieren und es als Teilnehmereinheit bezeichnen. Nur damit es nicht nur diese zehn Tage sind. Das sind nur meine kleinen Anpassungen. Wenn du das Bedürfnis verspürst, es auch zu schaffen, dann tu es. Ich benenne es einfach hier um und benenne die Datei um, um die Entitäts-Seele für unsere Methoden hier zu betreuen , ich werde es haben, und ich werde einfach der Öffentlichkeit schreiben. Entschuldigung, ich werde zuerst alle Methodennamen schreiben und dann füllen wir die Lücken aus. Also habe ich mir eine Aufgabe gestellt, bei der die Entität des Teilnehmers zurückgegeben wird. Und diese Aufgabe wird Get Attendee heißen. In Ordnung? Und es wird eine ID-String-ID benötigen, weil ich vorhabe, Waren für die ID zu verwenden. Gute Werte. Wir werden also dafür sorgen, dass gute Teilnehmer an Teilnehmer kommen, was einen alten Parameter übernimmt. Und dann wird eine Liste der Teilnehmerentitäten zurückgegeben. Und dann zwei weitere Methoden, eine zum Upsert und eine zum Löschen. Zwischen diesen Methoden haben wir also die volle Crud-Funktionalität. Ich werde das einfach in eine Schnittstelle extrahieren, damit wir diese Abstraktion und diese Vererbung haben. Da haben wir es. Jetzt können wir damit beginnen, das zu verkabeln. Also werde ich zweimal einen Konstruktor CT OR und Tab erstellen und diesen Konstruktor degenerieren. Und ich werde mein Symbolkonfigurationsobjekt in diesen Dienst einfügen , damit wir auf diese Konfigurationsdatei und die darin enthaltenen Werte zugreifen können . Lassen Sie mich das einfach umbenennen. Ich werde auch eine private, sagen wir konstante Zeichenfolge für unseren Tabellennamen haben. Und ich rufe diese Teilnehmer einfach an. Ordnung, so werden wir den Tisch in unserem Tabellenspeicher nennen . Und wir haben die Konfiguration. Jetzt brauche ich einen Kunden. Ordnung, also werde ich eine Methode erstellen, ich werde sie hier unten zu einer privaten Methode machen. Also eine private Aufgabe, die ein Tabellenclient-Objekt zurückgibt. In Ordnung? Und natürlich fügen Sie im Laufe der Zeit die fehlenden Benutzungsanweisungen hinzu. Wir sagen Get Table Client. Und dieser Kunde wird zuerst einen Kunden definieren, ich rufe nur Client an. Dieser Client wird der neuen Tabelle entsprechen. Nun, eigentlich ist das ein Service-Kunde. Entschuldigung, ich benenne das in Service Client um. Das ist also ein neuer Tabellenservice-Client. Da haben wir es. Dann übergeben wir diesen Konfigurationswert für unsere Verbindungszeichenfolge. Und falls Sie sich nicht an den Schlüssel erinnern, können Sie jederzeit hierher zurückkehren. Ich kann mich nicht erinnern, wie oft es hierher gesprungen ist, um es zu holen. Und das werden wir für den Konfigurationsschlüsselwert verwenden. Ordnung, jetzt, wo wir den Service-Client haben, speichern wir unseren Tisch, der Client wird den Servicekunden gleichgestellt sein. Punkte rufen Tabelle, Tabellenclient über den Tabellennamen ab. Der Tabellenname ist derselbe Wert, den wir hier oben gespeichert haben. Also können wir das machen. Dann warten wir auf unsere Kunden, um zu erstellen, falls es sie nicht gibt. Also sieh dir diese Null an. Wenn die Tabelle nicht existiert wenn wir versuchen, mit unserem Speicherkonto zu kommunizieren, haben wir die Möglichkeit, sie einfach zu erstellen, falls sie nicht existiert. Also das kann ich mir einfach aussuchen. Und natürlich wähle ich die asynchrone Option und dann können wir den Tabellenclient zurückgeben. Wenn die Tabelle also nicht existiert, erstellt sie sie und stellt eine Verbindung zu ihr her. Und dann verkörpert unser Kunde jetzt dieses Verbindungsobjekt. Lassen Sie uns also herausfinden, was wir alles tun. Holen Sie sich den Teilnehmer anhand des Ausweises. Jetzt müssen wir uns instabile Client-Instanz besorgen, und dann machen wir weiter und hole ich mir Entity Sync? Weißt du, es sieht einfach so aus. Und wenn wir warten, dann muss das Methyl natürlich asynchron sein. Der Var Table Client ist also gleich zwei. Wir würden den Tabellenclient bitten, die Methode zu wählen, die wir gerade entwickelt haben. Und dann hat die zweite Zeile, die Sie bemerken, einen Fehler. Also wird die Entität synchronisiert und alle geben die ID ein und wir haben einen Fehler. Warum haben wir einen Fehler? Weil es einen Partitionsschlüssel benötigt. In Ordnung? Wir müssen also einen Partitionsschlüssel und einen Zeilenschlüssel angeben , um die Entität zu erhalten. Die Teilnehmerentität hat hier also keinen Partitionsschlüsselwert, oder? Ich meine, ja, wir haben das eingebaute Feld für einen Partitionsschlüssel, aber wir haben kein dediziertes Feld , das als unser Partitionsschlüssel dient. Als Teil eines guten Designs würden wir ihm also tatsächlich eine weitere Immobilie geben. Und lassen Sie uns sehen, dass jeder Teilnehmer unserer Konferenz zum unserer Konferenz Beispiel in einer bestimmten Branche professionell ist. Was wir hier also tun können, ist Industrie zu sagen, wir nennen es einfach den Namen der Branche , in der Sie tätig sind, egal ob es sich um IT, Bildung usw. handelt. Und dann kann die Industrie hier unser Partitionsschlüssel sein , um alle Teilnehmer nach Branche darin zu unterteilen. Es macht Sinn, oder? Wenn Sie also Ihre Anwendung für Ihren Zweck erstellen, Sie immer sicherstellen, dass Sie die bestmöglichen Entscheidungen für Ihre Designbranche treffen, hier sind unsere Partitionsschlüssel. Also zurück zu unserer Methode und was ich tun werde, ist, dass wir String Industry und String ID übergeben. Und dann geben wir die Branche und den Ausweis weiter, um den Teilnehmer abzuholen. Für die nächste Methode, die darin besteht, Teilnehmer zu holen. Wir beginnen natürlich mit dem Tabellenclient und dann werden wir hier ein bisschen andere Codeteile machen . Also sage ich Seitentabelle. Ich neige dazu, dass das Entitätsobjekt namens Attendee Entities der Tabelle Client Punkt Query Attendee Entity entspricht. Und dann können wir die D2-Liste der Teilnehmerentitäten zurückgeben, und dann wird dieser Rückgabetyp erfüllt. Schauen wir uns jetzt unser Absurdes an. Wie immer beginnen wir mit unserem Kundenobjekt „Fishing Off“ oder „ Table“. Und wenn wir warten, muss die Methode eine Spüle sein. Und dann werden wir einfach weitermachen und auf die Punkte unserer Tischkunden warten . Lass mich das nochmal versuchen. Also oh, es tut mir leid. Das ist asynchron. Warte auf den Tischkunden. Da haben wir es. Entität nicht asynchron aktualisieren. Wir machen einfach weiter und geben ihm die Teilnehmer-Entität. Wir haben also bereits Werke von Hold Upsert gesehen, als wir Azure Cosmos gemacht haben Azure Cosmos gemacht falls Sie damit nicht so vertraut sind. Absurd ist im Grunde ein Portmanteau oder eine Kombination der Wörter aktualisieren und einfügen. Wenn die Entität also auf der Grundlage der bereitgestellten Informationen existiert, insbesondere mit dem Schlüssel und dem Partitionsschlüssel, ersetzt sie einfach die Details. Wenn es nicht existiert, wird der neue Datensatz erstellt. Ordnung, das ist also diese ganze Verbesserung, die für den Teilnehmer funktioniert oder ihn löscht. Natürlich machen wir es asynchron. Wir fahren fort und holen unseren Tischkunden ab. Und wir werden einfach weitermachen und warten auf Tisch Client Dot Delete ein Waschbecken. Und was ich für diesen nicht getan habe, ist die Parameter bereitzustellen , die wir zum asynchronen Löschen benötigen. Für das asynchrone Löschen müssen wir also den Partitionsschlüssel und die Zeilenschlüsselwerte übergeben . Und das sind die Werte, die wir in unseren Löschvorgang übergeben. Wenn Sie sich nun einmal nicht sicher sind, was Sie weitergeben sollten, können Sie sich jederzeit die Overlords der Methoden ansehen , und das wird Ihnen helfen, Hinweise zu erhalten. Also mach weiter und übergib die Parameter und das sollte delete entity a sink sein. Ich entschuldige mich dafür, dass Sie nicht async löschen, sondern die Entität asynchron löschen. Async hätte die Tabelle löschen können. In Ordnung, also delete entity wird diese beiden Parameter übernehmen. Jetzt haben wir unseren Service für unseren Table Storage erstellt. Wir haben hier eine leichte Anpassung an unserem Unternehmen vorgenommen. Und natürlich müssen wir unseren Vertrag, der die Schnittstelle ist, aktualisieren , weil ich die Signatur für diese Methode geändert habe. Also springe ich einfach dorthin und ändere das Löschen so, dass die beiden Parameter wie erwartet übernommen werden. Und damit es Teilnehmer bekommt, müssen wir es auch damit aktualisieren. In Ordnung? Sobald also der Vertrag zufrieden ist, ist der Service zufrieden. Und wir haben keine Konflikte und Aufzeichnungen. Und dann müssen wir das wie immer registrieren. Also springe ich einfach zu unserer program.cs und sehe einen Builder-Punkt. Lass mich das nochmal versuchen. Builder Dots Services. Punkte fügen einen Bereichsdienst für den vom Table Storage Service implementierten IT-Dienst hinzu. Und das war's. Wenn wir also zurückkommen, werden wir den Controller und die entsprechenden Ansichten erstellen, die es uns dann ermöglichen , den Registrierungsprozess zu vereinfachen. 11. Controller und Ansichten erstellen: Lassen Sie uns nun unseren Controller erstellen. Wir gehen direkt zu unserem Controller-Ordner , wählen Sie Controller aus und machen einfach einen MVC-Controller mit Readwrite-Aktionen. Klicken Sie auf Hinzufügen und lassen Sie uns das erreichen nennen. Dieser Controller für die Teilnehmerregistrierung muss natürlich angehängt werden. Und da haben wir sie, die Teilnehmerin, ihre Dissertation über Controller. Lassen Sie uns unseren IT-Service integrieren. Also ich Table Storage, I Table Storage Service. Stimmt es? Und wir können weitermachen und dies als privates schreibgeschütztes Feld initialisieren. In Ordnung? Und jetzt können wir mit unseren Aktionen beginnen. Im Allgemeinen sollten Sie Ansichtsmodelle verwenden, um zu verwalten, was auf der Vorderseite und anders als im Backend passiert. Aber noch einmal, dies ist eine kurze Demo, also entschuldigen Sie den Mangel an Best Practices und Abstraktionen wir machen nur eine einfache Demo, um die Konnektivität zu zeigen. Anschließend können Sie alle Best Practices und Sorgenabgrenzungen für unsere Indexansicht zusammenstellen. Als Erstes möchten wir natürlich die Daten abrufen. Also ich möchte sagen, dass var data dem Underscore table storage dot get attendees entspricht . Nun, das ist ein Synchron, auf den ich warten muss. Und dann konvertieren Sie diese Methode natürlich auch in eine asynchrone Methode. Dann kann ich diese Daten an die Ansicht übergeben. Lassen Sie uns nun die Ansicht generieren. Klicken Sie also mit der rechten Maustaste auf das Wort Ansicht und klicken Sie auf Ansicht hinzufügen. Und ich gehe einfach zu Razor View. Und ich werde eine Listenvorlage verwenden. Und die modale Klasse wird die Entität des Teilnehmers sein. Und ich kann alles andere verlassen. Ich muss nicht auf Skriptbibliotheken verweisen und dann auf Hinzufügen klicken. Und in kürzester Zeit wurde unsere Indexansicht generiert. Von hier aus werde ich mir also nicht die Mühe machen , das zu ändern, was wir uns noch ansehen. Was ich ändern werde, ist dieser Abschnitt, in dem wir die Primärschlüssel übergeben , damit wir den Rollenzeilenschlüssel verwenden können. Und natürlich brauchen wir die Party-Chunky, also lassen Sie mich diese entsprechend benennen. Wir benötigen also die ID und den Partitionsschlüssel , der Industries heißen wird. Ich kann sagen, dass industry dem item dot industry comma entspricht und id dem Wert Rho KI entspricht. Ordnung, das müssen wir also zu unserer Bearbeitung, zu unseren Details, zu unseren Löschmethoden übergehen unserer Bearbeitung, zu unseren Details, zu unseren Löschmethoden übergehen . Warum? Da all diese sowohl den Partitionsschlüssel als auch den ID-Wert benötigen, weil wir abrufen müssen, um zu bearbeiten, müssen wir abrufen, um uns die Details anzusehen. Und natürlich das Löschen, wir benötigen diese Daten auch. So werden wir den Index machen. Gehen wir nun zum nächsten über, das sind die Details. Und die Details würden einer ähnlichen Operation folgen. Aber denken Sie daran, dass wir hier die Int-ID und Wert der Zeichenkettenbranche verwenden. Und tatsächlich ist id eine Zeichenfolge, weil wir ein Raster verwenden werden. Und wir müssen hier einige Anpassungen vornehmen. Das muss also eine asynchrone Aufgabe sein. Natürlich hätte ich einfach den IntelliSense verwenden können, um das zu konvertieren. Lassen Sie mich also einfach die Methode Async machen , um diese Eingabe zu überspringen. Und dann bekommen wir keine Teilnehmer, aber wir bekommen unser Ten D, was nicht erwarten wird, dass wir den Branchenwert und den ID-Wert überschreiten. Also geben wir diese weiter und geben die Ansicht mit den Daten zurück. Und dann können wir diese Daten generieren, diese Ansicht. Und wir werden detaillieren, also verwenden wir die Detailvorlage für dieselbe Entität und fügen das hinzu. Im Moment haben wir unsere Detailansicht erstellt. Lassen Sie mich also alles schließen, was wir an dieser Stelle nicht benötigen. Für Create können wir das belassen, da wir keine Daten im Voraus oder Louis benötigen. Schauen wir uns das an. Wenn wir möchten, dass sie den Branchenwert bieten, könnten wir ihnen theoretisch eine Drop-down-Liste geben , die theoretisch nicht auf Ihren Bedürfnissen basiert. Sie könnten ihnen eine Dropdownliste geben , damit sie aus einer ausgewählten kuratierten Liste von Branchen auswählen können einer ausgewählten kuratierten Liste von Branchen auswählen , die Sie als Partitionsschlüssel haben möchten . Für diese einfache Demo werden wir sie einfach eingeben. Aber natürlich möchten Sie in Zukunft, in Zukunft, vielleicht eine kuratierte Liste haben, die Sie als Ihre Partei oder mögliche Partitionsschlüsselwerte anerkennen , oder? Lassen wir also die Ansicht „ Erstellen“ in Ruhe. Nun, lassen Sie uns diese Ansicht generieren. Also klicke ich einfach mit der rechten Maustaste auf Ansicht hinzufügen, Rasieransicht. Und dann verwenden wir unsere Erstellungsvorlagen für dieselbe Entität. Fahren Sie fort und fügen Sie hinzu. Nachdem die Creators hinzugefügt wurden, ist es Hinweis, dass es nicht async heißt, wir brauchten nichts Asynchrones in der Erstellung, aber wir müssen einige asynchrone Dinge innerhalb der Post-Methode tun . Bei der Post-Methode wird also von uns erwartet, dass wir uns wieder auf den Teilnehmer melden. Entitätsobjekt. Da haben wir es. Dann werden wir es versuchen. Bevor wir also überhaupt zum Inneren des Versuchs kommen, bevor wir den Service überhaupt anrufen, bevor wir den Service überhaupt anrufen, müssen wir einige Daten eingeben. Also hier wollte ich sagen, dass der Partitionsschlüssel, Partitionsschlüssel der Teilnehmerentität, gleich ist und dann ist das die Teilnehmerentität. Punkte. Worauf haben wir uns geeinigt? Ich glaube, es war die Industrie. Das ist richtig. Und dann gebe ich den Zeilenschlüssel an , also fügen wir den Zeilenschlüssel hinzu. Los geht's, wird Boyd dots entsprechen, neue GUID. Zu schnüren. Diese beiden können wir weitermachen und unseren Table Storage Service Punkt upsert Attendee anrufen und ihm das Attendee Entity Object geben. Weil alle anderen Felder durch das Ausfüllen des Create-Formulars festgelegt worden wären . Ich habe hier einen Fehler, weil die Konvertierung in Async nicht abgeschlossen wurde. Also lasst uns weitermachen und uns treffen. Das ist eine Aufgabe und dieser Fehler verschwindet. Jetzt können wir mit den Änderungen fortfahren. Die Bearbeitung muss also einen Abruf durchführen , der den Details ähnelt. Also können wir einfach weitermachen und das tun. Und natürlich müssen die Parameter ähnlich sein. Warum tippst du, wenn du kopieren und einfügen kannst? Und danach, oh, das muss asynchron sein, also lasst uns das konvertieren. Und dann, nach der Operation, werden wir tatsächlich etwas Ähnliches tun wie beim Erstellen. Wir müssen also sicherstellen, dass wir einen Partitionsschlüssel und einen Zeilenschlüssel zurücksetzen. Und dann machen wir weiter und gehen absurd vor. Ordnung, Sie werden also sehen, dass das Erstellen und Bearbeiten im Grunde nach dem gleichen Verfahren erfolgt, aber wir müssen mit OER etwas vorsichtiger sein. Also werde ich einfach all diese Parameter ändern und es wird durchgehen und sicherstellen, dass alles so funktioniert, wie wir es erwarten. Also setzen wir erneut Maßstäbe in der Branche. Was sind die Branchen , um der Partitionsschlüssel zu sein. Möchte ich aber einen neuen Zeilenschlüssel haben? Ich würde keinen neuen Zeilenschlüssel haben wollen. Also werde ich den entfernen , weil der Zeilenschlüssel bereits in dieser Entität enthalten ist und wir ihn im Formular jederzeit verstecken können , oder? Also ich möchte den Zeilenschlüssel erneut setzen, ich setze nur den Partitionsschlüssel zurück, nur für den Fall, dass sich dieser Wert bei der Bearbeitung geändert hat. Nun, ich muss das treffen, das ist natürlich synchron. Da haben wir es. Wir können weitermachen. Nun zum Löschen, ich verzichte auf die Notwendigkeit der Löschregistrierung. Ich werde die Bestätigung zumindest vorerst löschen. Also werde ich die getMethod entfernen und dann implementieren wir die Post-Methode. Ich habe es bereits in eine asynchrone Methode konvertiert und die Zeichenketten-ID und die industriellen Parameter eingegeben, ähnlich wie wir es für die Bearbeitung getan hatten. Und was wir tun, ist, ich warte, den Teilnehmer zu löschen, nachdem er die Branchen - und ID-Werte erhalten hat. Was wir also im Index tun werden ist, dies von einem Link zu einer tatsächlichen Schaltfläche zum Absenden von Formularen umzustrukturieren. Platziere das Forum einfach hier. Und was wir haben, ist ein einfaches Formular-Tag mit der ASB-Aktion Löschen, sodass die Post-Methode aufgerufen wird. Und dann haben wir zwei Eingänge, beide als versteckt. Und der Wert hier wird passen. Und lassen Sie mich diese Korrektur vornehmen. eine sollte also Item Dot Roll Key sein und das andere Item Dot Industry, das ist Value. Und dann entsprechen die Namen natürlich den Parameternamen, die wir in unseren Axonparametern skizziert haben . Und dann haben wir eine Eingabe , bei der es sich um eine Schaltfläche zum Senden handelt, die einfach wie eine Gefahrenschaltfläche aussieht. Also ich kann diesen Link kommentieren , weil wir ihn nicht brauchen. So werden wir also mit dem Löschen umgehen. Jetzt habe ich noch eine Sache, auf die ich hinweisen möchte, und das ist ein kleiner Teil unseres Refactorings und es ist eine Art Kritik, die ich an Visual Studio habe und die Art und Weise, wie es Methoden refraktiert, wenn es sie als Spüle durchführt. Aber wenn ich dieses asynchrone Schlüsselwort an das Ende anhänge, gefällt mir der Geldbeutel nicht. Ebenfalls. Als ob Sie feststellen würden , dass dies alles asynchrone Methoden sind und ich habe nicht gesagt, dass Teilnehmer asynchron sind. Wenn Sie also diese Namenskonvention bei Ihren Methoden beibehalten möchten , ist das in Ordnung. Es ist nicht etwas , das ich unbedingt über meine persönlichen Vorlieben hinaus praktiziere. Mir ist aufgefallen, dass MVC die Navigation nicht gut handhabt , wenn Async zum Namen des Axons und der Ansicht hinzugefügt wird . Seien Sie also auf der sicheren Seite. Mein Vorschlag ist, wenn es in async umbenannt wurde, entfernen Sie einfach diese asynchrone Benennung. Das ist einer. Also mach das für alle Aktionen. Du wirst sehen, dass ich das schon durchgemacht habe. Und all die, die asynchron bearbeiten und asynchron indexieren und alles. Es wurde nur in den ursprünglichen Namen umbenannt , ohne dass Async angehängt wurde. Das ist eine, um die Ansichten umzubenennen, oder? Alle diese Ansichten werden also tatsächlich versuchen, zur asynchronen Version zu wechseln , oder sie werden async genannt. Sie können also einfach weitermachen und das asynchrone Schlüsselwort entfernen. Ich klicke einfach darauf und drücke F2 auf meiner Tastatur, um es dann umzubenennen. Und die Aktion innerhalb der Formen, die es sind, es sollte einfach auf Bearbeiten gehen, oder? Das ist also nur eine kurze Überarbeitung, die ich vorschlage, um sicherzustellen , dass wir keine Probleme haben. Ich habe mich nie wirklich hingesetzt und gesagt: Lass mich versuchen, die asynchrone Namenskonvention zum Laufen zu bringen. Ich bevorzuge es einfach ohne, also habe ich versucht, es zu vermeiden. Stimmt. Und wurden schon einmal generiert. Wenn Sie die Bestätigungsseite haben wollten, hätten wir das Get so belassen die Ansicht entsprechend generiert wurde. Das ist also das eigentliche Formular, das ich gerade für den Index verwendet habe, um sicherzustellen, dass wir einfach weitermachen und den Beitrag löschen können. Die letzte Aktivität besteht darin, zu unserem Layout überzugehen und unser Menü so zu ändern, dass wir die Option haben , zum Controller für die Teilnehmerregistrierung zu wechseln, und es wird zur Indexansicht gewechselt, und dann können Sie ihm einen Namen geben. Also habe ich einfach den Datenschutzlink entfernt und ihn durch den Link zur Teilnehmerregistrierung ersetzt. Wenn wir also zurückkommen, können wir weitermachen und testen. 12. Testtabelle Storage CRUD: Ordnung, also ich führe die Anwendung aus und nur für den Fall , dass Sie sich fragen, wie sie ausgeführt wird. erneut sicher, dass das neue Projekt Ihr Startup-Projekt ist. Und dann können Sie einfach ohne Debuggen ausführen , wenn Sie es debuggen möchten. Und mach auf jeden Fall weiter. Ich laufe also ohne Debugging und gehe einfach weiter und klicke auf Teilnehmerregistrierung. Wir sehen also, dass unsere Indexseite geladen wurde, wir haben keine Fehler. Das heißt, es ist mit unserem Lager oder unseren Kegeln verbunden . Der Tisch sah, dass nichts zurückgekommen ist und er zeigt uns leer. Das ist in Ordnung. Lassen Sie uns Neues kreieren. Wenn ich einen neuen Testdatensatz erstelle, sagen wir, testen, testen und testen auf ti.com und industries IT, ich natürlich keinen Partitionsschlüssel, keinen Zeilenschlüssel und keine Zeitstempel an, um Teile der Bereinigung zu ersetzen, die auf unserer Benutzeroberfläche durchgeführt werden müsste. Aber das ist in Ordnung. Lass uns auf Erstellen klicken. Und hier sehen wir, dass es mit dem Rekord zurückgekommen ist. Die Branche und ich partitionieren also Schlüssel mit den gleichen Werten und wir haben einen neuen Good for oder 0-Schlüssel und einen Zeitstempelwert. Wenn ich ins Detail gehe, sehen wir alles darüber. Wir wissen also, dass der Partitionsschlüssel Fetch One by ID Slash funktioniert. Wenn ich zu Bearbeiten gehe, versuchen wir, hier etwas zu ändern. Also das ist Test 123, und ich werde speichern, und das hat die Datei bearbeitet. In Ordnung. Lass uns das jetzt zur Kenntnis nehmen oder so. Wenn ich noch einmal zu Edit gehe, habe ich die Branche diesmal auf ITU eins-zwei-drei umgestellt oder lass uns etwas Richtiges ausprobieren, oder? Also war es nicht, ES war Bildung. Und dann habe ich versucht, Knoten zu speichern , sodass ich einen völlig neuen Datensatz erhalte. Es ist derselbe Regelschlüssel, aber mit einem anderen Partitionsschlüssel. Damit musst du also sehr vorsichtig sein. Weil wir angegeben haben, dass der Tabellenspeicher einen zusammengesetzten Schlüssel verwendet. Es betrachtet sowohl den Partitionsschlüssel als auch den Zeilenschlüssel. Abgesehen davon könnte Deshawn also mehrere Datensätze mit demselben Sorry haben, wir können mehrere Partitionen mit den Datensätzen mit demselben ländlichen Schlüsselwert haben. Und genau das sehen wir hier. Das ist eine andere Partition und wir kommen hier mit dem Zeilenschlüsselwert zurecht, oder? Also ging es einfach weiter und schuf einen brandneuen Rekord. Damit müssen Sie also sehr vorsichtig sein, wenn diesen Partitionsschlüsselwert verwalten. Und aus diesem Grund könnten Sie wahrscheinlich einfach die Zeilentaste für beide Parteien verwenden, Sean Andrew-Taste, um sicherzustellen dass es immer derselbe Datensatz ist. Jetzt werde ich weitermachen und löschen, und ich mache mir nicht die Mühe , die Ästhetik und so zu korrigieren . Das ist wirklich nur eine Demonstration mit der Cloud-Integration, nicht unbedingt, um dem Stil zu entsprechen, oder? Also werde ich einfach weitermachen und das Löschen und Entfernen eines dieser Datensätze testen . Und da haben wir es. Das Löschen hat funktioniert. Genau dort haben wir gerade bestätigt, dass unsere Table Storage-Crowd funktioniert. wissen, was Sie jetzt zur weiteren Überlegung tun können , ist Dinge wie das Erstellen und Bearbeiten von Formularen zu bereinigen , sodass Sie den Zeilenschlüssel und den Partitionsschlüssel für den Zeitstempel nicht angezeigt werden müssen . Wir können diese aus dem Create entfernen und wir können sie aus unserem Zeitstempel entfernen. Also lasst uns weitermachen und das aufräumen. Dann müssen wir diese Dinge für unsere Indexliste wahrscheinlich auch nicht sehen. Ich muss also nicht den Partitionsschlüssel sehen, Zeile, Schlüssel, wahrscheinlich Zeile Keegan, bleib. Aber da es dann eher eine Idee ist, würde ich es wahrscheinlich nach vorne verschieben wollen. Und selbst dann, willst du das Raster wirklich sehen? Jetzt? Lassen Sie uns das auch entfernen. Keiner dieser drei Artikel existiert also auch hier. Also halten wir es einfach schön sauber. Und genau dort haben wir gerade Credit for Table Storage eingeführt. Lassen Sie uns nun sehen, dass sich unsere Anforderungen geändert haben. Und nein, wir müssen diesem Formular irgendeine Form des Datei-Uploads hinzufügen Formular irgendeine Form des , da die Teilnehmer einen Avatar oder ein Bild hochladen müssen , das wir sicher speichern und dann zur Anzeige abrufen müssen. Jetzt schauen wir uns an, wie wir Blob storage.com oder etwas Ähnliches nutzen können . 13. Blob Upload Service hinzufügen: In Ordnung, also haben sich unsere Anforderungen geändert. Ich weiß, dass wir ein hochgeladenes Bild für den Benutzer speichern müssen, aber wir möchten es aus verschiedenen Gründen nicht auf unseren Servern speichern. Was wir also tun werden , ist , diese Verantwortung auf einen Azure Blob Storage auszulagern. Also werde ich dieser Tabellenentität ein neues Feld hinzufügen und es Bildnamen nennen. Wir werden es also umbenennen, sodass es den gleichen Wert hat, den der Zeilenschlüssel haben würde. Und es wird einfach diesen Bildnamen hier speichern. Und dann wird das in Zukunft als Bezugspunkt dienen , wann immer wir auf den Blob verweisen müssen. Lassen Sie uns nun einen neuen Dienst erstellen, und das habe ich bereits getan. Wir werden es Blob Storage Service nennen. Also klicken Sie einfach mit der rechten Maustaste auf Dienste, fügen Sie eine neue Klasse hinzu und wir rufen einen Blob Storage Service auf. Und in meinem Blob Storage Service habe ich irgendwie Notizen geschrieben, ein Teil des Codes ist schon jemand, der dich durch den Code führt, sodass du mir nicht beim Tippen zuschauen musst. Jetzt habe ich zunächst einen Konstruktor erstellt, in den ich die Konfiguration eingefügt habe. Also kannst du weitermachen und das tun. Ich habe auch ein Feld namens Containername, das ich Teilnehmerbilder nenne. Nun, der Grund, warum ich ausschließlich Kleinbuchstaben verwende , ist dieser und ich habe bereits auf die Namenskonventionen angespielt. Mit Blob of Storage können Sie in Ihrem Knie keine Großbuchstaben verwenden. Also alles, was du benennst, musst du in Kleinbuchstaben benennen, du könntest einige Sonderzeichen verwenden. Fußnote, ich behalte nur alles in Kleinbuchstaben der Teilnehmerbilder. Und dann habe ich mein Methyl und das wird zu Container-Kunden führen. Jetzt können Sie es noch in diesen Truck packen , sodass Sie jede Ausnahme erwischen können , insbesondere die Benennung betrifft, denn was wir hier tun, ist, dass wir versuchen, einen Container zu erstellen, einen Blob-Container-Client, um genau zu sein, und diese Verbindungszeichenfolge aus der Konfiguration und diesen Containernamen übergeben diese Verbindungszeichenfolge aus . Wenn Ihr Name nun nicht übereinstimmt, haben Sie am Ende definitiv eine Ausnahme. Sie können also einfach versuchen, catch zu finden und hier einen Breakpoint zu setzen , damit Sie sehen können, was die Ausnahme ist An diesem Punkt würden Sie wahrscheinlich einen 400-Fehler erhalten. Nein, wir werden weitermachen und sehen ein kreatives Gewicht NICHT existiert. Wenn es also versucht, dies zu tun, würde es auf die Ausnahme stoßen. Und wenn es dann so weit kommt, wollen wir den Container zurückgeben. Das ist also unsere erste Methode in unserem neuen Service. Als Nächstes wollen wir einen Blob hochladen. Wir werden also eine Methode namens Upload Blob haben. Es wird eine asynchrone Aufgabe sein, die eine Zeichenfolge zurückgibt und die iPhone-Datei als Parametertyp verwendet. Wenn wir also mit MVC oder Dotnet Core hochladen, ist I Form File im Allgemeinen der Datentyp, der die hochgeladene Datei empfängt. Und dann geben wir einen Bildnamen ein. Als Erstes lege ich fest, wie der Blob-Name lauten wird. Und der Bildname hier steht für den Namen den ich eine Datei als Grund speichern möchte. Es ist eine gute Idee, Ihre Datei vor dem Hochladen umzubenennen . Wenn Sie mehrere Benutzer haben , die versuchen, Dateien mit den gleichen Namen hochzuladen, wird es Wenn Sie mehrere Benutzer haben , die versuchen, Dateien mit den gleichen Namen hochzuladen, zu Kollisionen kommen. Es ist also besser, es in etwas umzubenennen , das für den Datensatz einzigartig ist. Dann können wir weitermachen und diese Blob-Namen festlegen. Ich nehme also den Wert des Bildnamens kann einen eindeutigen Wert übergeben. Und dann füge ich diesen Namen an den ursprünglichen Pfad der geladenen Datei an. Der Pfad, der den Dateinamen der Erweiterungsformulardatei erhält , schaut sich den gesamten Dateinamen an, ruft den Punkt, JPEG, PNG, was auch immer es ist, und dann hängen wir ihn an unseren eindeutigen Namen an. Wir kommen in unser Land und zu unserem Kunden. Dann richte ich ein Speicherstream-Objekt ein, in ich aus der Formulardatei in den Speicherstream kopiere , die Position auf Null zurücksetze und dann verwenden wir den Client laden den Blob mit dem Blob-Namen aus dem Speicherstream hoch. In Ordnung? Und dieser Standard steht für das Stornierungstoken. Du könntest tatsächlich darauf verzichten. Da wir also keine Stornierungstoken verwenden , entfernen Sie diese. Und dann gebe ich den Namen Blob zurück. Nun, der Client selbst ist eigentlich der Client, hier wird es eigentlich eine Art Antwortblob geben, Inhaltsinformationen. Von diesem Objekt aus könnten Sie sich also den Wert ansehen und verschiedene Informationen über einen Blob sehen, der gerade hochgeladen wurde. Wenn Sie mehr Informationen als nur den Blob-Namen benötigen, können Sie diesen gerne verwenden. Wir könnten den Container-Client auch verwenden, um danach weitere Informationen zu erhalten. Aber vorerst wollte ich nur den Namen der Datei speichern. Nachdem wir unsere Datei hochgeladen haben, schauen wir uns an, wie wir sie abrufen oder bloben würden. Abrufen des Blobs wird jetzt eine besondere Situation sein denn was passiert, ist, dass der Blob-Container, wenn wir ihn einrichten , standardmäßig privat ist. Und wir haben bereits festgestellt, dass wir URLs verwenden um auf die verschiedenen Blobs zuzugreifen, sobald sie hochgeladen wurden Wir werden uns die URLs später genauer ansehen. Tatsache ist jedoch, dass Sie nicht einfach darauf zugreifen können, wenn es privat ist. Und Sie möchten es nicht einfach veröffentlichen, weil Sie vielleicht nie jemanden finden möchten , der darauf zugreifen kann. Beim Abrufen unserer Blobs müssen wir also sogenannte SAS-Token generieren, also Signatur-Token für gemeinsam genutzten Zugriff, und das werden wir uns in dieser Methode ansehen. Unsere neue Methode hier ist also get blob URL, die eine Zeichenfolge zurückgibt. Es ist also eine asynchrone Aufgabe , die eine Zeichenfolge zurückgibt. Und wieder nimmt es den Bildnamen an. Also initialisieren wir einen Container-Client und dann initialisieren wir auch einen Blob-Client relativ zu diesem Image-Namen. Jetzt haben wir das, was wir den Blob Builder nennen. Und das ist der Builder, der verwendet wurde, um das Shared Access-Signatur-Token zu generieren , auf das ich gerade angespielt habe. Was wir hier also tun werden, ist Blob-SAS-Builder einem neuen Objekt entspricht, das den Containernamen annimmt dass der Blob-SAS-Builder einem neuen Objekt entspricht, das den Containernamen annimmt, auf den wir zugreifen möchten, den Blob-Namen, auf den wir zugreifen möchten. Dann legen wir das Ablaufdatum für dieses Toolkit fest, was bedeutet, dass nach Ablauf dieser Zeit, und ich setze es einfach auf 2 Minuten. In Ordnung? Aber nach Ablauf dieser Zeit sollte niemand mehr auf diesen Link zugreifen oder ihn verwenden können , um auf die Ressource zuzugreifen. Ich saß im Protokoll für HTTPS und die Ressource für B. Wenn Sie den Mauszeiger über die Ressource bewegen, werden Sie sehen, dass B spezifisch für Blob ist. Wenn es ein anderer Typ ist, kannst du sehen, du kannst sein besagtes C für Container sehen und du hast verschiedene Optionen. Aber im Moment machen wir nur Blob Storage. Also legen wir B als Ressourcentyp fest. Und dann lege ich die Erlaubnis fest, dass der Blob-SAS-Builder gelesen werden darf. Bei dieser Aufzählung müssen Sie möglicherweise eine fehlende Benutzerreferenz für diese Aufzählung angeben. Aber wir haben hier mehrere Möglichkeiten. Sie können ein SAS-Token generieren, das das Löschen, Anzeigen usw. ermöglicht . Das sind alles Berechtigungen. Moment wollen wir nur lesen, weil wir das Bild betrachten wollen, wenn wir es abrufen. Und dann geben wir Blob Dot zurück generieren ein SAS-Token mit den Builder-Optionen, nicht String. Das wird also losgehen, generieren Sie das SAS-Token und geben Sie uns auch die vollständige URL. Und dann wird es die gesamte URL an uns zurückgeben. Wissen Sie, wann wir weitermachen, wir wollen diesen Blob entfernen , wenn der Datensatz gelöscht wird. Also werden wir hier eine weitere Methode haben , die Blob entfernt. Also hat die öffentliche Aufgabe AsyncTask Blob entfernt und wir nehmen erneut diesen Image-Namen, stellen eine Verbindung zum Container her erstellen einen Blob-Client. Und dann sage ich einfach , ich warte, Blob-Punkt löschen, falls vorhanden, eine Senke. Das ist nur ein Gefühl der Sicherheit. Es gibt Asynchron löschen, aber löschen, falls vorhanden. Hügel mit, wenn es einen gibt, wenn er nicht existiert, dann liegt kein Fehler vor, dann können wir alle Schnappschüsse löschen. Denken Sie also daran, dass wir mit Blob Storage eine Versionierung haben und jedes Mal , wenn es zu einer Kollision kommen könnte, eine neue Version erstellt und dieser Verlauf beibehalten wird. Wir können uns dafür entscheiden, alles zu löschen , sobald wir den Blob entfernt haben. Das war's also für den Koordinator für unseren Blob Storage Service. Ich werde einfach weitermachen und diese Schnittstelle extrahieren. Und nachdem diese Schnittstelle extrahiert ist, springen wir zu unserer program.cs und registrieren diesen Dienst genauso wie für den Tabellenspeicherdienst. Nein, wir können unsere Controller und Ansichten umgestalten. Fangen wir mit unseren Controllern oder Controllern an. Ich werde den Eye Blob Storage Service injizieren und ihn initialisieren. Wir wissen bereits, wie das geht. Und dann füge ich für die Indexaktion das für jede Schleife hinzu, jemanden, der für jedes Element im Detail sagt. Denn denken Sie daran, dass dies die Teilnehmerliste zurückgibt. Ich sage, hol dir den Bildnamen. Also versuche ich, dass der Bildname dem Blob-Speicherdienst entspricht, der die Blob-URL und den Artikelpunkt, den Bildnamen erhält . Warum ersetzen wir diesen Wert? Nun, ich werde nicht die gesamte URL speichern, ich speichere nur den Namen, oder? Das ist also eine einzigartige Namenspunkterweiterung. Also gebe ich den Namen weiter , den der Blob haben wird. Dann erhalte ich die gesamte SAS-URL, die ich sie dann ersetzen werde um zur Ansicht zurückzukehren und sie anzuzeigen. In einer saubereren Umgebung hätten wir natürlich diese Abstraktions- und Singapur-Ansichtsmodelle geschaffen , damit wir die Daten besser verarbeiten könnten und so weiter. Aber ohne all diese bewährten Methoden ist dies ein gutes Beispiel dafür, wie wir einfach weitermachen und die URL für diese Paper Pulses abrufen können . Als nächstes haben wir die Details. Für Details machen wir also etwas Ähnliches. Wir haben den Rekord hier. Und dann sehe ich mir einfach an, wie ein Punktbild benannt ist, um das Blut zu bekommen. Sie sind wieder einmal keine Methode zum Erstellen von Beiträgen im Format. Ich habe einen neuen Parameter hinzugefügt und das ist der I-Form-Dateiparameter. Diese I-Form-Datei erfasst also den Datei-Upload aus dem Formular, das wir ändern werden, und einige davon. Ich habe auch den Code überarbeitet. Also habe ich damit begonnen, eine ID für ein neues Grid festzulegen. Dann setze ich den Zeilenschlüssel, um diese ID zu sein. Jetzt wird mein eindeutiger Name für die Benennung meiner Blob-Dateien die ID sein. Es muss nicht der Ausweis sein. Die ID wird jedes Mal einzigartig sein. Ich denke, das ist eine einfache Möglichkeit, einfach in Blob Storage zu schauen und herauszufinden, was was ist, wann immer ich es brauche. Ich sehe also, ob die Punktlänge der Formulardatei, was bedeutet, dass etwas hochgeladen wurde , größer als Null ist, dann setze ich den Bildnamen so, dass entspricht, was auch immer zurückgegeben wird. Denken Sie also daran, dass unser Upload-Blob, wenn ich zur Implementierung gehe und das und den Bildnamen anfüge, das die ID ist. Wir machen weiter und passen das an, laden es hoch. Und dann gebe ich nur das Ergebnis der Verkettung von ID und Erweiterung zurück . Das werden wir also als Bildnamen haben. Und wenn dann nichts hochgeladen wurde, können wir es wie ein Standardbild einrichten. In Ordnung, und dann machen wir weiter und absurd den Teilnehmer. Gehen wir zu unserer Bearbeitung und Bearbeitung über. Wir machen einfach dasselbe , wenn wir überprüfen, wo, wenn die Formulardatei größer als Null ist, dann laden wir unseren Blob hoch. Ich übergebe diesen Zeilenschlüsselwert und die Formulardatei, die wir hinzugefügt haben, auch als Parameter. Eine Sache in der Ansicht, auf die ich nicht hingewiesen habe, wenn ich hier zur Ansicht gehe, stellt sicher, dass wir uns daran erinnern, dass wir die Eingabewerte für den Zeilenschlüssel, den Partitionsschlüssel und den Zeitstempel entfernt haben Eingabewerte für den Zeilenschlüssel, den Partitionsschlüssel und den Zeitstempel entfernt . Um jedoch den ursprünglichen Zeilenschlüssel für den Datensatz beizubehalten, stellen Sie sicher, dass Sie den versteckten ASP für den Zeilenschlüssel im Formular haben . In Ordnung, das ist also Edit. Und dann gehen wir endlich zum Löschen. Löschen ist jetzt etwas schwierig, da wir den ursprünglichen Bildnamen benötigen , um den Blob zu entfernen. Also musste ich zuerst Fitch, den Teilnehmer, tun. Dann können wir das löschen und dann können wir den Blob entfernen, indem wir diese Daten umgehen, diesen Bildnamen, weil wir ihn zuerst abgerufen haben, wir haben ihn im Speicher. Wir können es aus dem Tabellenspeicher entfernen und dann das verwenden, was wir im Speicher gespeichert haben, dann mit diesen Daten zum Löschen paketieren. Lassen Sie uns abschließend einen Blick auf die verschiedenen Änderungen werfen, die wir an den Ansichten vorgenommen haben. Für die Create-Ansicht habe ich also einen neuen Abschnitt hinzugefügt, wir den Avatar hochladen können. Also habe ich gerade eine neue Formulargruppe erstellt. Wir haben das Label hier und ich habe gerade unseren Tar hochgeladen. Und dann ist der Eingabetyp Datei, und der Name hier ist so formatiert, dass er dem Parameter entspricht , nach dem wir im Beitrag suchen. Und das war's für unseren Create. Und meine Fähigkeiten zum Kopieren und Einfügen gerieten außer Kontrolle. Lassen Sie mich also das Validierungszeug entfernen. Und ich benötige dieselbe Kontrolle innerhalb der Bearbeitung. Also füge ich diese Formulargruppe einfach auch zum Bearbeitungsformular hinzu. Wenn also nichts hochgeladen wird, ist das in Ordnung, denn wir behalten den gleichen Blob und alles ist gut. Wenn jedoch etwas hochgeladen wird, laden wir es hoch und es wird den Ersatz entsprechend vornehmen. Jetzt habe ich in der Detailansicht dieser Datenliste eine weitere DT DD-Kombination hinzugefügt. Also hier habe ich Avatar und jetzt habe ich das Bild-Tag , das Bildnamen Model Dot verwendet. Und ich sitze gerade in unserer Breite von 150 und einer Körpergröße von 150. Dann habe ich im Index eine weitere Tabellenüberschrift hinzugefügt. Und wenn du es beschriften möchtest, könntest du Avatar oder Displaybild sagen, was auch immer es ist. Und dann habe ich in der TR für die Daten ein neues td hinzugefügt, das ist ein ähnliches Bild-Tag. Die Quelle wird der Name des Punktbilds des Elements sein, und die Breite wird 50 und die Höhe 50 sein. In Ordnung? habe auch die Form der Bits überarbeitet, um die HTML-Links innerhalb des Forums zu platzieren , sodass sie von links nach rechts angezeigt werden , anstatt wie zuvor planlos angezeigt zu werden. Ich weiß, ich sagte, wir müssten es nicht reparieren, aber es tut mir leid, ich konnte nicht damit fortfahren, es zu reparieren. Also habe ich diese beiden Links einfach in das Formular direkt neben die Schaltfläche Senden löschen eingefügt. Und ich habe die neuen HTML-Attribute für die Klasse hinzugefügt, BTN-Warnung für Bearbeitung und btn-primary für Details. all diesen Änderungen werde ich also Nach all diesen Änderungen werde ich also einfach alles speichern. Und wenn wir zurückkommen, werden wir unsere Tests machen. 14. Blob Service-Funktionen: Eine schnelle Anpassung, bevor wir mit dem Testen beginnen. Denken Sie daran, dass wir dieses Attribut in das Formular aufnehmen müssen, wenn wir das Hochladen von Formularen oder Dateien in einem Formular erleichtern möchten in das Formular aufnehmen müssen, wenn wir das Hochladen von Formularen oder Dateien in einem . Deshalb habe ich es versäumt, in der vorherigen Lektion darauf hinzuweisen , dass wir unsere Ansichten nachrüsten. Der Tintyp entspricht also mehrteiligen Schrägstrich-Formulardaten. Stellen Sie also sicher, dass dies sowohl im Erstellungsformular als auch in unserem Bearbeitungsformular vorhanden ist . Ich werde dieses versteckte Feld auch zum Bearbeitungsformular hinzufügen , um sicherzustellen, dass wir den Wert des Bildnamens beibehalten können. Denken Sie also daran, dass wir den ursprünglichen Bildnamen beibehalten müssen . Und wenn der Benutzer ein neues Bild hochlädt, werden wir das alte ändern. Aber wir müssen die ursprünglichen Bildnamen beibehalten , damit dieser Wert nicht verloren geht , wenn wir ein Upsert vornehmen. Lassen Sie uns nun zu unserer Bearbeitung übergehen. Nach der Aktion und ich bin gerade zu den Anpassungen gegangen, die hier erforderlich sind. Erstens möchte ich diese if-Anweisung nach oben verschieben , weil wir es absurd gemacht haben , bevor wir überhaupt versucht haben, zu überprüfen, ob wir die Datei aktualisieren sollten. Und wir sollten auch das Bildfeld aktualisieren. Du hast das Namensfeld erwähnt, oder? Also haben wir diesen Teil bei uns selbst vernachlässigt, aber wir können ihn jetzt korrigieren. Wir sollten also überprüfen, ob die Länge der Formulardatei größer als Null ist. Und all die Dinge, die eine Datei bilden, könnten auch null sein. Also werde ich das irgendwie nicht sicher machen. Setz das Fragezeichen da hin. Wenn die Formulardatei also einen Wert hat, überprüfen wir die Länge, ob sie größer als Null ist. Und natürlich könnten wir auch einfach überprüfen, ob es nicht gleich Null ist, denn dann hätte es natürlich eine Länge, aber mit welcher Überprüfung Sie sich wohler fühlen, dann sagen wir, dass der Bildname dem entspricht, was hochgeladen wurde. Wenn wir etwas hochladen, gehen wir davon aus, dass wir neu sind Wir müssen diesen Image-Namen aktualisieren. Und dann können wir weitermachen und aufstehen. Lassen Sie uns nun unsere Datenseite testen und alle vorhandenen Datensätze löschen , alle vorhandenen Datensätze löschen weil ich alles getestet habe und keinen weiteren Datensatz für die Durchführung dieses Tests erstellt habe . Wenn Sie also alle Ihre vorhandenen Tabellenspeicherdatensätze löschen möchten , können Sie jederzeit zu Ihrem Speicherbrowser zurückkehren oder den Speicher-Explorer verwenden, den Sie möglicherweise heruntergeladen haben. Gehen Sie zu den Tabellen und Sie sehen die Tabelle, die wir zuvor erstellt haben, und dann können Sie jeden Datensatz löschen , den Sie Ihrer Meinung nach löschen müssen. Wenn ich nun starte, starte ich diese Anwendung und navigiere zur Registrierung. Dort sehen wir unseren Tisch. Lass mich einen neuen Datensatz erstellen und ich werde einen Avatar hochladen. Und ich wähle hier ein Bild aus und gebe ihm Vorname, Nachname, E-Mail-Adresse und Branche und dann Erstellen. Und da haben wir es. Jetzt sehe ich ein Bild, das hier in Avatar angezeigt wird. Schau dir das an. Und ich sehe all die Daten, die verwendet wurden, um zu wissen, was dieses Bild ist. Wenn ich auf Details klicke, erhalte ich einen defekten Link. Es ist also klar, dass wir hier etwas arbeiten müssen. Und was ich tun werde, ist das Element zu inspizieren. Und da haben wir es. Das ist der Fehler. Hey, es druckt eigentlich die Worte, modelliere das Bild. Also lasst uns einfach rüberspringen und das dort reparieren , wo das eigentlich am Schild sein sollte. Und das sollte kein kleines Modell sein, das sollte ein großes M-Modell sein , um die Daten darzustellen. Lassen Sie mich das beheben und erneut ausführen. Und wenn ich den Datensatz hier neu lade , wird das Bild richtig angezeigt? Nein, ich habe mein Inspect Element immer noch geöffnet. Und wenn Sie sich diese URL ansehen, werden Sie feststellen, dass dies die URL zum eigentlichen Blob ist. Lassen Sie uns also überprüfen, was die ganze URL-Sache ist. Wenn ich zurück zum Portal gehe und es aktualisiere, sehen wir unseren Datensatz und/oder den Datensatz mit einem Bildnamen. Das ist natürlich dieselbe Wertepunkterweiterung wie der Zeilenschlüssel. Das ist in Ordnung. Wir haben es erneut umbenannt, damit wir bei jedem Upload Einzigartigkeit haben können . Wenn ich nun zu den Blob-Containern übergehe, werden Sie als Erstes sehen, dass die Teilnehmerbilder erstellt wurden und dass sie als privater Blob oder Container erstellt wurden, oder? Wenn ich reingehe und mir die Bilder ansehe, wird jeder Blockblob , der sich in diesem Container befindet, auch privat sein. Also kann ich hierher gehen und die URL kopieren. Wenn ich versuche, zu dieser URL zu gehen, erhalte ich die Meldung, dass die angegebene Ressource nicht existiert. Jetzt wissen wir, dass das nicht stimmt , denn hier ist die URL zum Blob-Speicher und dann der Container und dann der Name der Datei und wir haben ihn einfach kopiert , damit wir wissen, dass die Datei existiert. Da es in der Zugriffsebene auf privat gesetzt ist, können wir nicht direkt über die URL darauf zugreifen. Auch hier können wir je nach Zugriffsebene den Großhandelszugriff auf alle Blobs in unserem Container aktivieren oder einschränken . Nun, dieser ist privat. Deshalb generieren wir diese SAS-URL. Und wenn ich dann auf SAS generieren klicke, sehen Sie, dass wir jetzt all diese Parameter einrichten und dann das SAS-Token und die URL generieren können . Und wenn dieser Tolkien und die URL generiert wurden, kopiere ich das und versuche dann erneut, im Browser darauf zuzugreifen. Nun, mein Browser lädt die Datei tatsächlich herunter. Ordnung, also das passiert, wenn ich, wenn Sie einen bestimmten Browser verwenden, in anderen Browsern verwende, wird die Datei tatsächlich geöffnet. Aber schauen wir uns die URL ein bisschen an und fügen sie in Notepad Plus, Plus ein, damit wir sie etwas genauer überprüfen können. Nein, wir beginnen wieder mit den gleichen Teilen, der Aufbewahrung der Kegel, dem Behälter und dann dem Dateinamen. Und dann werden Sie feststellen, dass Sie eine Abfragezeichenfolge haben. Also haben wir Sb, das ist die Erlaubnis, das war's für unser Windows. Es fängt an. Okay. Das ist der richtige Zeitpunkt. Wann endet es? Das ist der richtige Zeitpunkt. Was ist das Protokoll? Https, und dann haben wir andere Parameter. Der Typ ist Blob und die Signatur ist diese zufällige degenerierte Zeichenfolge. Und SV dort steht für eine signierte Version, oder? würdest du nicht einstellen, das wird gesetzt, während die Signatur generiert wird. Das bringt dieses SAS-Token die Tabelle, wo wir diese spezielle URL erhalten, die den Zugriff so lange ermöglicht, wie wir zwischen der Start- und Endzeit liegen. Und du siehst hier, das war für einen Tag angesetzt. Dabei wurden nur die Standardoptionen verwendet. Aber natürlich können wir eine Zeitspanne festlegen, die spezifisch für den Zweck ist , für den wir das Token benötigen. Jetzt haben Sie einen Einblick in das, was hinter den Kulissen passiert , wenn wir diese URL erhalten. Lass uns zu Edit springen. Und wenn wir mit Fetch the Record bearbeiten, lassen Sie mich versuchen, diese Datei zu ändern. Und nachdem ich auf Speichern geklickt habe, ist ein Fehler aufgetreten. Also möchte ich Ihnen natürlich die Steuerbehörde zeigen und dann werden wir sie gemeinsam durcharbeiten. Der Fehler hier, der nach dem Versuch , einen Blob hochzuladen, aufgetreten ist, war also , dass der angegebene Blob bereits existiert. In Ordnung? Also können wir natürlich keinen Blob hochladen , der diesen Namen bereits hat. Also, was ich tun werde, ist den Blob zu entfernen, falls er bereits existiert, und dann können wir weitermachen und ihn erstellen. Blob hochzuladen, springen wir also zum Um Blob hochzuladen, springen wir also zum Upload von Blob und ändern, was innerhalb dieser Methode passiert. So wie es aussieht, gehen wir einfach zum Container und versuchen ihn hochzuladen. Und wenn Sie den Mauszeiger darüber bewegen, sehen Sie, wo steht, dass ein neuer Block-Blob erstellt wird, was bedeutet, dass, wie Sie gesehen haben, offensichtlich eine Ausnahme zurückgegeben wird, für die der Blob bereits existiert. Deshalb ist es sehr wichtig, die Dokumentation zu lesen. Um einen vorhandenen Block-Blob zu überschreiben, besorgen Sie sich einen Blob-Client und laden Sie ihn dann hoch. Ordnung, wir nehmen die Anweisungen, damit wir diese Zeile, in der wir den Blob-Client haben, wiederverwenden und diese ursprüngliche Upload-Zeile durch eine neue ersetzen können und diese ursprüngliche Upload-Zeile durch eine neue ersetzen , die besagt, dass ein feuchter Blob-Punkt-Upload async erfolgt. Und dann gebe ich weiter, ich verwende benannte Parameter, also weiß genau, was wir übergeben, wo der Inhalt der Speicherstream sein wird. Und dann überschreiben wir wahr. Wenn Override also auf true gesetzt wird, werden alle vorhandenen Blobs überschrieben. Und ohne diese Einstellung wäre es falsch. Am Ende wird also dieselbe Ausnahme wie bei uns angezeigt, wenn wir es versäumen , diesen Override-Parameter einzugeben. Jetzt gibt es noch eine Wendung. Und das ist, wenn ich zunächst einen J-Peg hochladen und ihn dann in ein PNG ändere. An diesem Punkt werden wir, obwohl der ID-Wert der Bildname derselbe ist, und der Bildname derselbe ist, am Ende zwei verschiedene Dateien haben. Und müssen wir wirklich alte Dateien speichern, oder? Technisch gesehen könnten Sie also auch einen Löschvorgang ausführen, bevor Sie das Laden durchführen , nur um sicherzustellen , dass Sie am Ende nicht zwei verschiedene Versionen dessen haben, was der Avatar einer Person sein sollte. Das können Sie also auch in Betracht ziehen. Um dem zu entsprechen, was in der Bearbeitungsaktion passiert ist, werde ich den ursprünglichen Bildnamen als Parameter an unsere Upload-Blob-Methode senden den ursprünglichen Bildnamen , was bedeutet, dass wir jetzt einen neuen Parameter einführen müssen . Unser neuer Parameter wird also eine Zeichenfolge sein, was kein hörbarer ursprünglicher Blob-Name ist. Und ich initialisiere es auf nicht. Und wenn wir die Schnittstelle aktualisieren, müssen wir natürlich auch die Implementierung aktualisieren. Und wir haben den gleichen Parameter hier aufgeführt. Jetzt, wo wir diesen ursprünglichen Blob-Namenswert haben, werde ich überprüfen, ob er existiert. Also werde ich sagen, wenn der String Dot Null oder leer ist und diesen Wert übergeben, dann wollen wir warten, Blob entfernen und ihm den ursprünglichen Blob-Namen geben. Wir werden den vorhandenen Blob entfernen und dann können wir mit dem Hochladen fortfahren. Sie sehen also, dass in unserem Fall viele Dynamiken zu unterscheiden sind , da wir am Ende möglicherweise unterschiedliche Dateien und Erweiterungen haben und wir nicht garantieren können , dass diese immer die bestehende überschreiben. Es ist sicherer für uns, den alten zu entfernen und dann den neuen hinzuzufügen. In einer Situation, in der der Dateiname vielleicht trotzdem immer konsistent ist , müssen Sie das alles wahrscheinlich nicht durchmachen. Aber noch einmal Optionen. Nun, da wir diese Anpassungen vorgenommen haben, lassen Sie uns fortfahren und unsere Änderungen testen. Schon wieder. Ich habe das Formular geladen, ich habe bereits meine andere Datei ausgewählt, und dann werde ich sehen. Und da haben wir es. Jetzt habe ich einen brandneuen Avatar. Ich habe den Upload oder das mit diesem Datensatz verknüpfte Blob-Bild erfolgreich geändert . Das ist also nett und einfach. Natürlich hatte es einige Nuancen. Kennen Sie das Beispiel, das ich gegeben habe, wo die Dateierweiterung unterschiedlich sein kann und wir am Ende mehrere Dateien für denselben Datensatz haben, den ich tatsächlich hatte, der mir passiert ist. Also hier ist eine Version mit JPEG und eine andere Version mit PNG, der Ursprung der PNG-Dateien, die neue Datei war JP, und anstatt sie zu ersetzen, habe ich einfach eine neue erstellt, die ich dereferenzieren muss. Aus diesem Grund sollten Sie vor dem Hochladen entfernen, um sicherzustellen , dass Sie nicht mehrere potenzielle Dateien haben. Sogar dieser wurde zuvor ohne Erweiterung hochgeladen. sind kleine Dinge, bei denen du vorsichtig und vorsichtig sein solltest, wenn du mit Blobs umgehst. Abschließend werde ich das Löschen testen. Lassen Sie uns also diesen Datensatz löschen und wir wissen, dass der erforderliche Tabellenspeicher gelöscht wurde. Lass uns wieder hierher springen und mindestens eine dieser Dateien sollte verschwinden. Okay, zwei davon sind weg , weil ich das Original entfernt habe. Dann habe ich auch den entfernt , der an den Datensatz angehängt war. Dieser war an nichts angehängt sodass ich ihn manuell löschen kann. Das ist in Ordnung. Aber zumindest wissen wir jetzt, dass wir erfolgreich in unseren Blob-Speicher schreiben und aus unserem Blob-Speicher lesen, indem wir einen Aufsatz, einen Stiel, verwenden. Und das gibt uns nur für diesen Zeitraum eingeschränkten Zugang. Und wir sind in der Lage, eine neue zu entfernen und hochzuladen, Dateiverknüpfungen zu ändern und so weiter. Wenn wir jetzt zurückkommen, werden wir unseren Warteschlangendienst implementieren. Und die Szenarien, die wollen, dass sich ein Teilnehmer registriert hat. Wir möchten eine E-Mail versenden, aber wir möchten uns nicht direkt mit dem E-Mail-Dienst verbinden . Stattdessen möchten wir es einer Warteschlange hinzufügen, damit es später unverarbeitet verbraucht werden kann. 15. Queue Service hinzufügen: Also werden wir jetzt unsere Warteschlangenmechanismen implementieren. Das erste, was ich tun werde , ist ein neues Modell zu erstellen. Ich modelliere einen Datensatz weil wir ihn nicht speichern werden. Aber ich möchte einen Kurs, damit wir eine entsprechend stark getippte Nachricht haben können . Also werde ich diese eine E-Mail-Nachricht nennen. Und die E-Mail-Nachricht wird drei Eigenschaften haben. Die erste wird also eine Zeichenfolge sein, die die E-Mail-Adresse ist. Dann werden wir Zeitstempel haben. Also sage ich einfach Datum, Uhrzeit nennt man diesen Zeitstempel. Und das Letzte ist die eigentliche Botschaft. Das ist also gut für den Moment. Und dann müssen wir uns wie immer auf einen neuen Service einstellen. Lassen Sie uns also weitermachen und einen weiteren Cluster- oder Dienstordner hinzufügen . Dieses Mal nennen wir es einen Service. Und unser Warteschlangendienst wird einen Konstruktor haben , der unsere Konfiguration einfügt, ähnlich wie bei anderen Diensten, wir werden auch einen festgelegten Warteschlangennamen haben , den ich als Teilnehmer-E-Mails nenne. Jetzt werde ich einfach ein Publikum haben, das ist eine Aufgabe einer öffentlichen Aufgabe namens Nachricht senden. Und das Senden einer Nachricht nimmt das E-Mail-Nachrichtenobjekt entgegen. Also E-Mail-Nachricht, und ich nenne es einfach E-Mail-Nachricht. Und die Sache ist, dass ich in diese Warteschlange hart codiere. Möglicherweise möchten Sie diese Flexibilität aber auch gegenüber anderen Hinweisen beibehalten diese Flexibilität aber auch gegenüber , mit denen Sie möglicherweise interagieren müssen. Was Sie also für diesen Warteschlangendienst tun könnten ist, anstatt diesen Warteschlangennamen festzulegen, Sie könnten hier einfach den Zeichenkettennamen als Parameter sagen . Damit Sie den Warteschlangennamen tatsächlich festlegen können , wenn Sie die gewünschte Nachricht weitergeben. Aber dann ist das ein bestimmtes. Also werde ich einfach alles spezifisch für unseren E-Mail-Nachrichtenbetrieb machen . Jetzt initialisiere ich einen Queue-Client und werde mir diesmal nicht die Mühe machen, dafür eine ganze Methode zu erstellen , da wir nur eine Nachricht haben, eine Methode, die eine gesendete Nachricht ist. Also habe ich gesagt, var acute client entspricht einem neuen Queue-Client, für den wir die Verbindungszeichenfolge benötigen. Das bekommen wir aus der Konfiguration. Wir erhalten den Namen der Warteschlange basierend auf diesem Wert. Und dann stellen wir die Warteschlangen-Client-Optionen so ein, dass sie die 64 für Nachrichten codieren. Denken Sie also daran, dass wir das aufschieben, ein- und ausschalten. Wenn wir die Warteschlange selbst erstellen. Dann sehen wir wie üblich, einen Q-Client oder eine Warteschleife, die Clients mit einem Punkt erstellen, falls nicht, existiert, eine Senke. Also stellen wir sicher, dass es existiert, bevor wir versuchen , eine Nachricht zu senden. Um eine Nachricht zu senden, können wir ganz einfach sagen Q Client Punkt Nachricht senden. Und natürlich gibt es eine asynchrone Option, aber lassen Sie mich weitermachen und eingeben, wie die Nachricht lauten sollte. Beachten Sie also, dass diese einen Zeichenkettennachrichtentext erwarten, aber wir haben ein Objekt einer E-Mail-Nachricht. Also lass mich weitermachen und ich warte zuerst. Wie konvertiere ich das nun in etwas, das als Zeichenfolge gesendet werden kann? Nun, wir können es als JSON serialisieren. Ich kann also sagen, dass die Var-Nachricht JSON entspricht, konvertiere dieses serialisierte Objekt. Und dann geben wir unsere E-Mail-Nachricht , die unsere Klasse einfach in eine JSON-Nachricht oder ein JSON-String-Objekt konvertiert . Und dann können wir diese Zeichenfolge als unsere Nachricht weitergeben. Wir können unsere Schnittstelle extrahieren. Das ist die einzige Methode, die wir benötigen, um das Interface zu extrahieren es wie gewohnt in der program.cs zu registrieren, und wir fügen es als Sculpt hinzu, genau wie die anderen Dienste davor. Und dann können wir Änderungen vornehmen oder die Ridges werden der Registrierungsprüfung unterzogen. Und nachdem wir unseren neuen IQ-Service eingeführt haben, IQ Service, gefällt mir dieser Name. Jetzt können wir die Hotspots ändern. Offensichtlich entsteht also ein Hotspot an dem wir, nachdem alles erledigt ist und wir gespeichert haben, unsere E-Mail-Nachricht erstellen wollen. Ich kann also sagen, dass var email einer neuen E-Mail-Nachricht entspricht. Und ich werde die E-Mail-Adresse so einrichten, dass sie der eingegebenen Entitätspunkt-E-Mail-Adresse des Teilnehmers entspricht. Stimmt. Wir können den Zeitstempel auf ein Datum und eine UTC-bekannte Uhrzeit setzen, und dann können wir unsere Nachricht so einstellen, dass sie so etwas wie Hallo, Vorname, Nachname, Hallo lautet. Und sie haben sich nur verkettet. Also verwenden wir, naja, Interpolation. Also verwenden wir hier Interpolation. Und dann habe ich die Zeile mit dem umgekehrten Schrägstrich n, dem umgekehrten Schrägstrich r mitgebracht . Vielen Dank, dass Sie sich für diese Veranstaltung angemeldet haben. Und ich habe ein gerades Up. Und dann habe ich die Zeile noch einmal gebracht und dann gesagt, Ihre Aufzeichnung wurde zum späteren Nachschlagen gespeichert. Jetzt, wo ich dieses E-Mail-Objekt habe, kann ich meinen Warteschlangendienst und C aufrufen, eine Nachricht senden und sie einfach an diese E-Mail-Objekte weiterleiten. Natürlich wissen wir, dass wir ähnliche Dinge an anderer Stelle in unserer Anwendung tun können ähnliche Dinge an anderer Stelle in , denn wenn sie bearbeitet wird, könnten wir sie darüber informieren , dass sie nicht geändert wurde. Also hallo, FirstName, LastName, Ihr Datensatz wurde erfolgreich geändert und dann senden wir diese Nachricht. Und wenn es dann gelöscht wird, kann ich das auch tun, denn denken Sie daran, wir hätten diese Daten hier vorgeladen. Nachdem alles entfernt wurde, erstellen wir unsere E-Mail-Nachricht und ich habe sie kopiert und eingefügt. Also würden wir hier natürlich Daten als Objekt für E-Mail-Adresse, Vorname, Nachname verwenden . Dann wird die E-Mail-Nachricht so geändert, dass sie erfolgreich entfernt wurde, und dann senden wir los. Das ist also alles, was wir unseren Warteschlangendienst in unseren Betrieb integrieren würden . Wenn wir jetzt zurückkommen, werden wir das alles validieren. 16. Test Queue Service: Lassen Sie uns also jemanden testen, um einen neuen Datensatz zu erstellen und ein Bild hochzuladen. Und natürlich verwenden wir nur Test, Test, Test und IoT, das von der Industrie geschaffen wurde. Und sobald wir das validiert haben, haben wir einen Datensatz und unser Blob hochgeladen, wir können zu unserem Storage Explorer wechseln. Und ich werde alles aktualisieren, damit ich sehen kann ob die neue Warteschlange oder der neue Tennisschläger darauf hindeuten, und dann Refresh sagen. Und jetzt sehe ich die E-Mails der Teilnehmer als meine Warteschlange und springe da rein. Und ich habe mehrere Nachrichten , weil ich getestet habe, oder? Sie können hier sehen, dass wir mehrere Nachrichten haben und ich habe eine vollständige Crud-Operation durchgeführt um sicherzustellen, dass jede Nachricht funktioniert. Ich habe hier also einen , der zeigt, wann er erstellt wurde, Ihr Datensatz wurde nicht zum späteren Nachschlagen gespeichert. Das ist gut. Und dann haben wir hier noch einen, der besagt, dass er erfolgreich entfernt wurde. Wir haben hier noch eine , die besagt, dass es okay war, ich habe keine Änderungen vorgenommen, aber Sie sehen hier, dass all diese Nachrichten tatsächlich in der Warteschlange stehen. Stellen wir uns jetzt vor, dass der E-Mail-Dienst eigentlich nicht funktioniert, oder? Das hätten also E-Mails sein sollen , die sofort versendet werden. Aber unser E-Mail-Service war Morgendämmerung. Das bedeutet, dass sich der Benutzer registriert hätte und wir den Betrieb möglicherweise mit dem Eindruck verlassen hätten den Betrieb möglicherweise mit dem Eindruck verlassen , dass er oder eine Verteilung vor Ort ist. Weil der E-Mail-Dienst das Website-Feld erledigt hatte um eine Verbindung herzustellen und dann eine Ausnahme auszulösen und gab ihm wahrscheinlich eine Fehlermeldung. Wir wollen nicht, dass das passiert, oder? Ein anderes Szenario ist, dass okay, vielleicht haben wir die richtige Fehlerbehandlung eingerichtet. Also, obwohl wir versucht haben, eine Verbindung mit dem E-Mail-Anbieter herzustellen, haben wir keine Ausnahme ausgelöst, aber dann ist diese E-Mail für immer verloren, oder? IQ ist also eine hervorragende Möglichkeit , unsere Nachrichten für unseren Betrieb aufzubewahren, bis wir sie später tatsächlich verarbeiten können. Wenn wir zurückkommen und jetzt wissen, dass unser Q so funktioniert, wie wir es erwarten, werden wir ein kleines Hilfsprogramm erstellen, das die Nachrichten tatsächlich aus der Warteschlange heraussucht. Und sobald wir die Nachrichten aus der Warteschlange erhalten haben, kann die Operation, die Sie ausführen müssen , ausgeführt werden. 17. Protokolle und Dienste-Aufrufe: Während wir unsere App testen, möchte ich mir nur ein paar Sekunden Zeit nehmen, um darauf hinzuweisen, was in der Konsole passiert, damit Sie ein Gefühl dafür bekommen, was hinter all diesen Serviceaufrufen passiert. Also haben wir unseren Tabellendienst oder Blob Storage Service und unseren Queue Storage Service verkabelt . Und wenn Sie sich die Konsole oder die Protokolle ansehen , die von der App für jede Anfrage ausgespuckt werden, werden Sie feststellen, dass wir nur GET und Post und verschiedene Arten von HTTP- oder HTTPS-Anfragen an eine Reihe von URLs senden GET und Post und verschiedene Arten von . Wirklich und wahrlich, es ist nicht viel komplizierter als das. Im Wesentlichen sind unsere Service-Kunden und all diese nur Wrapper für HTTP-Clients , die über RESTful-APIs mit jedem unserer Dienste kommunizieren . Und wir haben zu Beginn des Kurses gesagt, dass die RESTful-APIs es uns ermöglichen, mit unseren Ressourcen zu interagieren und sie zu verwalten . Hier ist ein Live-Beispiel für Holdout-Werke. Wenn wir also mit unserem Tabellendienst sprechen rp geladen ist, haben wir versucht, die Daten abzurufen. Ordnung, und später wirst du sehen, dass wir mit, okay, hier ist eine, für die wir ein Tool bekommen. Stimmt. Hier ist der, den ich wollte bei dem ich den Datensatz gelöscht habe. Also wurde es aus dem Blob gelöscht. Wenn Sie sich also die URL ansehen, werden Sie feststellen, dass das der Blob-Service ist, oder? Und es hat diesen Blob-Namen gelöscht. Und das ist eine Löschanfrage. Ordnung, hier ist die Ausgabe, in etwas an der Q aktualisiert wurde. Ordnung, das ist also die URL zum Warteschlangendienst. Und hier ist eine Post-Anfrage , bei der etwas unter Q erstellt wurde. Und hier werde ich von den Tabellen abgeholt. Ich weise also nur darauf hin , dass alles wirklich nur ein RESTful-API-Aufruf ist , der im Hintergrund stattfindet. 18. Queue Message Reader einrichten: wir nun wissen, dass unser Dienst funktioniert, lassen Sie uns einen Dienst erstellen , der diesen Warteschlangendienst abonniert und dann die Nachricht verarbeitet. Und was auch immer Sie damit machen müssen, Sie können es danach tun. Aber lassen Sie uns ein Hilfsprogramm erstellen, das Verbindung zu diesen Nachrichten herstellt und sie verarbeitet. Was werde ich tun, um eine Konsolen-App zu erstellen. Also werde ich in der Lösung ein neues Projekt öffnen oder ein neues hinzufügen. Und diese wird eine einfache Konsolen-App sein. Wählen Sie also eine Vorlage für eine Konsolen-App. Und wir werden diese eine Console Dot Q Consumer Dots Demo nennen . Und dann fahren wir fort und klicken auf Weiter. Wir verwenden die neuesten.net7, die zum Zeitpunkt der Aufnahme und der Erstellung verfügbar sind . Jetzt muss ich ein Paket hinzufügen, und ich muss dasselbe Paket hinzufügen, das wir zuvor für Queue-Speicher hinzugefügt haben , also Null-Punkt-Speicherwarteschlangen . Also ich gehe einfach schnell und ich denke, inzwischen wissen wir alle, dass wir ein Ganzes oder Pakete schnell hinzufügen müssen. Also werde ich diese Route wählen , bei der ich einfach eine neue Artikelgruppe erstelle und dann einfach dieselbe Paketreferenz einfüge , die in der MVC-App war. Und spar dir das. Und du wirst im Hintergrund losgehen und diese Abhängigkeit für mich lösen. Lassen Sie uns jetzt etwas Code schreiben. Das erste, was wir tun möchten, ist natürlich die Verbindung zu unserem Warteschlangenspeicher einzurichten oder herzustellen, oder? Und das geschieht über unsere Verbindungszeichenfolge für das Speicherkonto. Wissen Sie, Sie haben dabei ein paar Optionen . Die einfachste Option wäre, hier einfach eine Variable zu erstellen. Ich werde die Verbindungszeichenfolge genannt und gebe ihr den Wert. Aber aus dem offensichtlichen Grund, dass Sie Ihre Verbindungszeichenfolge nicht direkt in den Code und die fest codierte Ebene einfügen möchten direkt in den Code und die fest codierte , werden wir diesen Ansatz nicht verfolgen. Für diese Situation können wir ein Secrets verwenden, was bedeutet, dass wir ein paar zusätzliche Pakete installieren ein paar zusätzliche Pakete und sie in einer Konfigurationsdatei speichern und dann entsprechend darauf verweisen müssten. Und dann können wir im weiteren Sinne auch einfach eine globale Umgebungsvariable auf unserem Computer festlegen . Und wenn wir diese Anwendung dann auf einem anderen Computer bereitstellen wollen, müssen sie natürlich sicherstellen, dass auch eine Umgebungsvariable existiert dort auch eine Umgebungsvariable existiert , die diesen Ansatz für diese spezielle Übung verfolgt. Dazu verwenden wir unser Terminalfenster. Und unabhängig davon, ob Sie es verwenden, wenn Sie sich auf einem Windows-Computer befinden, werden wir den folgenden Befehl verwenden. Und dann zeige ich euch das entsprechende für Linux und macOS. Wenn Sie sich auf einem Windows-Computer befinden, unabhängig davon, ob Sie Visual Studio- oder Visual Studio-Code verwenden, können Sie set X, den Vornamen, die ich als Ihre Speicherverbindungszeichenfolge sehe, sagen . Und dann legen wir den Wert hier fest. Also springe ich einfach zu dem Webprojekt, in dem wir den Wert der Verbindungszeichenfolge aus früheren Übungen hatten . Und das werde ich hier als Wert und Set verwenden. Achten Sie auf die richtige Formatierung. Sie können sehen, dass ich einige Fehler hatte, weil ich ein Komma kopiert und zusätzliche Anführungszeichen hinzugefügt habe. Stellen Sie also sicher, dass Sie nur die Anführungszeichen und den Wert dazwischen erhalten. Wenn Sie nun Linux oder Mac OS verwenden, ist der Befehl im Grunde identisch. Aber anstatt Set X zu sagen, werden Sie Exporte sehen. Und es ist dasselbe Format , um den Namen der Variablen und dann den Wert zu exportieren . Ein Nachteil dieser Methode ist, dass Sie Ihren Computer danach möglicherweise neu starten müssen , damit Sie auf Pause und Neustart klicken können . Wenn Sie zurückkommen, wir dort weiter, wo wir aufgehört haben. Nachdem wir diese Umgebungsvariable festgelegt haben, können wir die Verbindungszeichenvariable hier festlegen. Ich werde also sagen, dass die Zeichenfolge der Zeichenfolge der Umgebung entspricht, die Umgebungsvariable abrufen und wir finden sie anhand ihres Namens. In Ordnung, dann initialisieren wir einen neuen Queue-Client. Und das wird ähnlich sein wie das, was wir zuvor gemacht haben. Cute Client Q entspricht nu q client verweist auf die Verbindungszeichenfolge und den Namen dieses Q. Ich werde versuchen, Nachrichten aus der Warteschlange abzurufen. Das erste, was ich tun möchte, ist sicherzustellen, dass die QA existiert, was nur das Rudimentäre ist, oder? Wenn ich warte, ist Q dot Q vorhanden. Und dann werde ich innerhalb dieser If-Aussage weitermachen und überprüfen , ob werde ich innerhalb dieser If-Aussage weitermachen und überprüfen da viele Nachrichten sind. Also zuerst, um die Immobilie zu bekommen. Also sage ich, Q properties entspricht unserem Gewicht q dot get properties a sink. Und wenn ich diese Eigenschaften habe, kann ich jetzt überprüfen, ob die ungefähre, Entschuldigung, Nachricht Kegel lautet. Ich werde sagen, während Eigenschaften diese ungefähre Nachricht Cohens d ist größer als Null. Okay, das ist also nur eine Zahl, die angibt, wie viele Nachrichten sich in der Warteschlange befinden. Und dann richte ich eine Zeitschleife ein, um zu sagen, naja, solange Nachrichten in der Warteschlange sind, wollen wir etwas tun. Also werde ich sehen, mach weiter und hole die Nachrichten ab. Also werde ich sagen, dass die Zeichenkettennachricht gleich ist und ich warte auf die Methode, die ich gerade erstellen, abrufen werde . nächste Nachricht ist sink, oder wir müssen uns nicht unbedingt an diese asynchrone Namenskonvention halten. Aber ich will abrufen, lass mich meine Rechtschreibung richtig machen. Und dann sage ich Konsolenpunkt, schreibe Zeile und drucke die Nachricht aus. Und ich setze nur das erhaltene Wort auf. Lassen Sie uns diese Methode implementieren. Also werde ich einfach die folgende Methode degenerieren. Es wird eine asynchrone Methode sein, die eine Zeichenfolge zurückgibt. Und innerhalb dieser Methode ich zuerst eine Nachricht ab. Nein, Sie können bis zu mehrere Nachrichten gleichzeitig abrufen , oder? Also wollte ich Queue-Nachricht sagen, abgerufene Nachricht, und das ist ein Array. Und dann wartete ich auf den Q-Punkt, um Nachrichten asynchron zu empfangen. Und dann können wir einen Kegel nehmen. Dieser Kegel ist die maximale Anzahl von Nachrichten und das Minimum ist eins und das Maximum ist 32. Also ich kann tatsächlich sagen, gib mir bis zu 32 Nachrichten auf einmal. Aber im Moment mache ich einfach einen. Also werden wir sie eins nach dem anderen verarbeiten. Und dann muss ich von Base-64 in ein Byte-Array und dann von einem Byte-Array in eine Zeichenfolge konvertieren Base-64 in ein Byte-Array . Ich werde dir das alles erklären. In unserem Storage Explorer. Wenn wir uns unsere Nachrichten ansehen, sehen wir, dass die Nachricht im Klartext bleibt , und das sieht gut aus. Wenn Sie jedoch darauf doppelklicken, werden Sie sehen, dass es Ihnen zeigt, dass es es als base-64 dekodiert hat . Es zeigt mir also, was in der Nachricht steht. Aber wirklich, wenn Sie es sich im Ruhezustand ansehen würden, wenn jemand Zugriff auf die Warteschlange haben möchte und einfach versuchen zu sehen, dass die Nachrichten versuchen , die Nachrichten abzufangen wenn jemand Zugriff auf die Warteschlange haben möchte und einfach versuchen zu sehen, dass die Nachrichten versuchen, die Nachrichten abzufangen, anstatt nur eine Base-64-kodierte Zeichenfolge zu sehen, die die Texte nicht wirklich sehen würde, als ob Sie sie eine Base-64-kodierte Zeichenfolge zu sehen, die die Texte nicht wirklich sehen würde sehen würden. Nein. Aus diesem Grund werden diese Nachrichten, wenn wir sie verarbeiten, tatsächlich als Base-64-kodierte Nachrichten ausgegeben. Und dann muss ich von Basis 64 konvertieren, oder? Das ist also die base-64-kodierte Zeichenfolge. Das sind also eigentlich Binärdaten, oder? Und dann kann ich von dieser Beta-RE wieder zu UTF konvertieren. Das ist also alles, der ganze Ablauf muss funktionieren. Wenn wir die Base-64-Codierung verwenden, ich die Nachricht, nachdem ich sie aus der Warteschlange abgerufen habe, möchte ich die Nachricht, nachdem ich sie aus der Warteschlange abgerufen habe, entfernen. Also werde ich sagen, dass eine Nachricht mit einem Gewicht von einem Punkt asynchron gelöscht wird. Und wir entfernen es anhand der abgerufenen Nachricht als anhand der Nachrichten-ID und der Pop-Quittung der abgerufenen Nachricht. Ordnung, und wenn Sie den Mauszeiger über diese Eigenschaften bewegen, werden Sie sehen, was die einzelnen Eigenschaften bedeuten. Also im Wesentlichen, nachdem wir die Nachricht verarbeitet haben oder wir die Nachricht abgerufen haben und wir sie aus der Warteschlange entfernen können. Und dann werde ich die Nachricht zurücksenden, die wir dann verarbeiten können. Daran kann ich mich nicht erinnern. Ja, wir werden dieses Rattenland trösten, aber das könnte leicht sein, die E-Mail zu senden oder in der Datenbank zu speichern. Denn wenn es sich um eine asynchrone Operation handelt und danach etwas ist, das passieren muss. Wie wir bereits sagten, insbesondere in einer Microservices-Situation, hätten dies die Agenten sein können, die den Knoten unabhängig von dem Prozess , den der Skew antreibt, das Ankerbein abwickelt , oder? Das ist also nur eine einfache Konsolen-App. In einem realen Szenario würden Sie wahrscheinlich unsere Arbeit oder unseren Dienst verwenden , der immer aktiviert ist und den Sie jedes Mal manuell ausführen müssten. Der Code würde bei unserer Arbeit oder unserem Service so ziemlich genauso aussehen . Wenn es Ihre Funktion wäre, die wir uns später im Kurs ansehen werden. Dann werden wir sehen, wie wir auch mit einer solchen Situation umgehen können . Lassen Sie uns also weitermachen und testen, und ich werde einigen wichtigen Bereichen einige Grenzwerte festlegen. Dies dient nur dazu, dass wir genau verfolgen können, was passiert, wenn das Kabel durchläuft. Also werde ich sicherstellen , dass die Konsole aktiviert ist, mein Standardprojekt ist, und mit dem Debugging fortfahren. Und wir haben die ersten Breakpoints erreicht, sodass wir sicher sein können, dass das Q existiert. Und dann springe ich einfach runter zur While-Schleife. Also ging es weiter und holte die Grundstücke ab. Schauen wir uns dieses Objekt an und wir sehen hier, dass der ungefähre Nachrichtenkegel fünf ist. Aus diesem Grund springen wir in unsere While-Schleife. Und dann werden wir weitermachen und die nächste Nachricht abrufen. Und ich drücke einfach F5, damit es nach unten springt. Lassen Sie uns das beurteilen. Zuerst erhielten wir eine Nachricht, nein, denn das sind Nachrichten, obwohl wir eine angeben, wird sie immer noch ein Array oder einen Sammlungstyp zurückgeben. Also wirklich und wahrhaftig, es wird ein Array mit dieser Anzahl von Nachrichten zurückgeben . Also bekommen wir in diesem Fall ein Array mit einer Nachricht, das ist in Ordnung. Wenn wir uns nun dieses abgerufene Nachrichtenobjekt ansehen, werden wir sehen, dass wir unseren Körper haben. Wir haben ein Dequeue-Kegel, was bedeutet, wie oft war diese Meldung rot? Wir haben ein Gültigkeitsdatum, das auf den verschiedenen Konfigurationen basiert , die wir eingerichtet hätten, und wir haben Nachrichtentexte, also haben wir all diese Eigenschaften dieses Nachrichtenobjekt, das Warteschlangennachrichtenobjekt. Beachten Sie nun, dass der Körper eine kodierte Zeichenfolge ist. Das ist es also, worüber wir sprechen. Das macht für jeden Menschen keinen Sinn , es sei denn, Sie sind ein laufender Computer. Also werden wir das in eine Zeichenfolge konvertieren und es dann in ein Byte-Array konvertieren. Und dann konvertieren wir aus dem Byte-Array in eine tatsächliche Zeichenfolge. Dann löschen wir die Nachricht, denn jetzt, wo wir die Nachricht abgerufen haben, benötigen wir sie nicht mehr in der Warteschlange. Das ist also die Nachricht , die der JSON-Text ist , über den wir gesprochen haben oder den wir in der Vorschau gesehen haben. Jetzt können wir damit fortfahren , es zu löschen. Und dann wird die Nachricht zurückgegeben. Und ich drücke einfach auf Weiter und entferne die Breakpoints , sodass alle Nachrichten auf der Konsole ausgedruckt werden . Und hier habe ich eine Ausnahme. 19. Code-Bereinigung und Optimierung: In Ordnung, willkommen zurück Leute. In dieser Lektion werden wir nur einige Codeoptimierungen vornehmen und aufräumen. Und die erste Slash-Cleanup-Aktivität für die Optimierung bringt uns direkt zurück zu der Konsolen-App, die wir gerade erstellt haben. Also habe ich die While-Schleife durch eine For-Loop ersetzt. Da ich eine bestimmte Anzahl von Nachrichten erhalte, ist es sinnvoll, sie einfach unterschiedlich oft durchzugehen , oder? Das wird uns also definitiv helfen, diesen Indexfehler zu überwinden, da wir erst so weit gehen , wenn wir uns innerhalb der Kegel befinden. Das ist also unser schneller Refactor. Natürlich gibt es mehrere Möglichkeiten, dies zu tun, und das war nur ein Irrtum, warum ich die While-Schleife überhaupt gemacht habe. Hey, wir leben, wir lernen. Das ist also unsere erste Korrektur. Nein, ich möchte meine Aufmerksamkeit wieder auf das Webprojekt und die Tatsache lenken , dass okay, wir hier die Speicher - oder Doppelpunktzeichenfolge haben. Aber dann instanziieren wir in unseren Diensten wie Blob Storage, Queue Storage und Table Storage jedes Mal einen Client. Also können wir das wahrscheinlich ein bisschen umgestalten. Lassen Sie uns also damit beginnen, ein neues Paket zu besorgen. Und ich werde hier einfach die Entwicklerkonsole verwenden hier einfach die Entwicklerkonsole , damit wir alle auf derselben Seite sind, unabhängig davon, ob Sie Visual Studio oder Visual Studio Code verwenden. Und im Webprojekt werde ich dotnet add package hinzufügen. Und das Paket besteht aus Microsoft Dot Extensions, die wie Ihre sind. Das gibt uns nun die Möglichkeit , in unsere program.cs überzugehen. Und während der Installation fange ich an, den Code zu schreiben. Das gibt mir die Möglichkeit, in die program.cs zu gehen und einen Builder zu sehen, der Dienste punktet, und sie als Ihre Dienste oder Ihre Kunden hinzuzufügen. Dann kann ich das mit einem Builder und dem Lambda-Körper initialisieren und mit einem Semikolon beenden . Also, was machen wir da drin? Füge eine Nulldrüse hinzu. Nun, ich kann jetzt Builder sagen. Punkte, Kunden hinzufügen. Sie sehen also hier, nein, ich kann Blob Service Client hinzufügen, ich kann Warteschlangendienstpläne hinzufügen und ich kann Table Service Client hinzufügen, all das hier. Beginnen wir also einfach mit dem Add Blob Service Client, und wir haben mehrere Überladungen. Die am einfachsten zu verwendende Überlastung ist die die eine Verbindungszeichenfolge erforderlich ist. Also kann ich zur Konfiguration springen und wir erhalten einfach diese Speicherverbindungszeichenfolge. Und wir gehen zur Builder-Pot-Konfiguration. Ich habe meine Schreibweise nicht richtig verstanden. Konfigurationspunkte. Nun, das nicht. Erstellen Sie unsere Konfiguration. Und dann ist der Schlüssel, nach dem wir suchen , unsere Speicherverbindungszeichenfolge. Jetzt, wo ich diesen einen Ort habe, kann ich ihn woanders wiederverwenden. Also builder dot add blob, service client, und ich übergebe den Wert der Verbindungszeichenfolge. Okay, ich kann auch bauen ihre Tochter Kunden bedienen musste und wisst ihr was? Es braucht die Verbindungszeichenfolge und weißt du was? Ich kann auch hinzufügen. Wenn Sie Tabelle gesagt haben, dann haben Sie absolut Recht. Lassen Sie uns nun ein wenig auf den Queue-Service-Client eingehen. Wenn wir zum Warteschlangendienst wechseln, denken Sie daran, dass wir beim Erstellen eines neuen Clients einige Optionen hatten. Und dieser Optionsabschnitt enthielt die von uns gewünschte Standardkodierung. Zurück in der Datei program.cs können wir diese Konfiguration also tatsächlich erweitern, indem am Ende dieser Zeile Punktkonfigurationsoptionen hinzufügen. Und dann erstellen wir einen kleinen Konfigurationskörper. Ich verwende nur C als mein Lambda-Token. Dann stelle ich in diesem Konfigurationsabschnitt die C-Punkt-Nachrichtencodierung so ein, dass sie derselben Base-64-Codierung entspricht . Wisse, dass wir das alles erledigt haben. Wir können unsere bestehenden Dienste mithilfe dieser Dienste erweitern, anstatt sie im laufenden Betrieb bereitzustellen. Was wir also tun können, ist mit dem Blob Storage-Client zu beginnen. Und was wir tun werden, ist den injizierten Service zu verwenden , um einen Container-Client zu erhalten. Und wir müssen diese Methode nicht jedes Mal aufrufen. Also werde ich den Blob-Service-Client in diesen Konstruktor injizieren den Blob-Service-Client und ein lokales Feld initialisieren. Wir wissen bereits, wie das geht. Und wenn das injiziert ist, kann ich tatsächlich, anstatt zu sagen, dass der Var-Container unserem Gewicht entspricht, Blob-Container-Client bekommen. Ich kann das tatsächlich durch einen Blob Service Client Dot Get Container Client ersetzen . Und das ist kein Waschbecken. Deshalb bekommen wir diese rote Linie. In Ordnung? Und ich kann alle Instanzen dieser manuellen Methode durchgehen und ersetzen , um nur unseren Client zu verwenden. Und wenn ich möchte, kann ich diese Methode löschen. Was ich da für die Nachwelt belassen werde , damit wir sehen können, was früher war. Wir haben die Tabellenservice-Clients , die wir injizieren und initialisieren. Und dann können wir unseren Weg, einen Tabellenclient zu bekommen, ersetzen. Ich kann es wissen, rufen Sie einfach unter Service Client, get dot, get table client an. Und dann verweisen wir auf den Tabellennamen und nur auf Karton, der verschüttet wird. Da haben wir es. Also jetzt all diese Verweise, und das ist wahrscheinlich eher der Blob Storage Client-Initialisierung ähnlich . Und es ist immer noch der Queue-Speicher oder die Client-Initialisierung. Also das ist in Ordnung. Und natürlich dient diese Methode hier als Referenz. Ich habe sie alle durchgesehen und ersetzt, aber ich wollte nur darauf hinweisen, dass das, was wir hier nicht tun, darin besteht, etwas zu erschaffen, wenn es nicht existiert. Es besteht also die Möglichkeit , dass beim Abrufen des Clients Null zurückgegeben wird, weil er nicht existiert. Ein weiterer Faktor hätte also sein können, dass wir das einfach eliminieren und den Service-Client trotzdem auf der Grundlage dieses Anrufs zurücksenden. Ordnung, wir könnten also immer noch den Methodenaufruf dazu beibehalten und den Client für jeden Anruf zurückgeben, oder? Oder für jede Methode. Es liegt also an dir, oder? Wir hätten auch einfach einen Tabellenclient hier oben oder ein Feld oben definieren einen Tabellenclient hier oben können. Dann initialisieren wir das Feld in unserem Konstruktor und dann verwenden wir einfach die Felder. Es gibt also mehrere Möglichkeiten, dies zu tun. diesem Sinne werde ich nun zur Datei program.cs zurückkehren und uns einen anderen Weg ansehen wir das angehen könnten. Wir injizieren hier den Client, den Service-Client. Und weil wir dann den Serviceplan einfügen, müssen wir eine neue Instanz des eigentlichen Clients erstellen eine neue Instanz des , die uns mit der Ressource verbindet. Was wäre, wenn wir einfach den direkten Kunden für die Ressource registrieren wollten ? Wir müssten also bei dem, einen etwas anderen Ansatz verfolgen was wir hier einfach selbst machen, einen etwas anderen Ansatz verfolgen. Und ich mache es einfach in einer anderen Anzeige als Ihrem Kundenbereich. Nur damit wir zunächst einen Deal haben können. In Ordnung? Nehmen wir also an, ich wollte direkt den Queue-Client, nicht den Queue Service-Plan, nicht den Servicenamen, sondern den eigentlichen Client. Ich würde eigentlich den Builder Dot Add Client verwenden. Dann kann ich die Datentypen angeben. Also möchte ich die Optionen Warteschlange, Client und Q haben. Und dann initialisiere ich einen Delegaten mithilfe von Platzhaltern für die erwarteten Parameter für diese Methode Wenn Sie den Mauszeiger über die AD-Anlage bewegen, sehen Sie, wofür die Parameter entweder stehen. Und dann verwenden wir einen Lambda-Ausdruck für unseren Objektkörper. Und dann wurde erwartet, dass innerhalb dieser Methode eine neue Instanz von Q Client zurückgegeben wird. Das heißt, wenn ich zu diesem Warteschlangendienst übergehe , wo wir unsere Clients initialisiert hätten . Ich könnte diesen Code tatsächlich hier verwenden und einen neuen Client zurückgeben, der die Konfiguration oder die Speicherverbindungszeichenfolge verwendet . Ich könnte den Warteschlangennamen auch in meine Konfiguration aufnehmen. Ich muss es also nicht fest in der Datei codiert haben. Also lass uns das machen. Tatsächlich werde ich einen ganz neuen Abschnitt in der Konfiguration erstellen und ihn als Ihren Speicher bezeichnen . Und ich werde die Verbindungszeichenfolge dort einfügen. Und ich nehme einfach das Wort Speicher ist irgendwie überflüssig. Also jetzt der Schlüssel und ich mache dasselbe, zur gleichen Zeit, weil ich nicht vergessen will. Jetzt wäre der Schlüssel zur Konfiguration für die Verbindungszeichenfolge die Azure Storage-Verbindungszeichenfolge mit Doppelpunkt, oder? Weil es jetzt in diesem Unterabschnitt ist. Und ich mache das alles, nein. Also, das hat ein Komma dort gesetzt. Jetzt kann ich den Warteschlangennamen oder mehrere Warteschlangennamen eingeben, unabhängig von den Q-Namen, die ich für meine Anwendung benötige. Ich kann sie hier hinstellen. Der Name der Warteschlange wird also lauten, sag es mir nicht, los geht's. Ich auch dazu. Da haben wir es. Der Name der Warteschlange lautet also Teilnehmer-E-Mail-Stunde und ich verwende einfach den Blob Storage. Ich habe nur die Schlüssel von Null und Table Storage gesetzt. Weil diese Technik für alle drei Speicherdienste verwendet werden kann . Also zurück in der program.cs werde ich eine schnelle Anpassung vornehmen, da ich hier die Konfigurationswerte benötige. Also ändere ich das von Builder auf B und dann wird der Queue-Name geändert , die Builder-Punkt-Konfiguration. Und dann können wir das als Ihren Speicherbereich und das als Schlüssel für den Warteschlangennamen bezeichnen. In Ordnung? Und natürlich müssen wir zurückkehren. Dies müssen also UQ-Clients mit all diesen Werten zurückgegeben werden. Jetzt, wo wir diese Q-Clients im Warteschlangendienst registriert haben , kann ich wissen, dass dieser Q-Client direkt injiziert wird. Ich benötige diesen direkten Verweis auf den Queue-Namen nicht. Und ich kann diesen süßen Kunden verwenden, um die gesamte Kommunikation entsprechend zu erledigen. Also muss ich das bei der Initialisierung innerhalb der gesendeten Nachricht oder innerhalb dieses Dienstes überhaupt nicht tun? Nein, ich kann etwas Ähnliches für den Table Storage machen. Ich kann einfach diesen Tabellennamen nehmen und wir können ihn in unseren App-Einstellungs-JSON einfügen. Und dann kopiere ich in unserer program.cs einfach den Queue-Client und füge ihn in denselben Abschnitt ein. Und wir werden einen Client für Tabellenclients mit Tabellen-Client-Optionen hinzufügen . Und was wir hier tun, ist eine neue Instanz des Tabellenclients mit einer Speicherverbindungszeichenfolge und unserem Azure Storage Table Namen, Schlüssel oder Table Storage zurückzugeben einer Speicherverbindungszeichenfolge und unserem Azure Storage Table Namen, . Tabelle, Name der Speichertabelle, wie auch immer Sie es nennen, Tabellenspeicher. In Ordnung? Jetzt kann ich diesen Tabellenclient direkt in den Tabellenspeicherdienst injizieren . Also, anstatt den Service-Client zu injizieren , lassen Sie uns einfach beides machen. Also tabellarischer Client und ich werden das initialisieren. Also lasse ich den ganzen Code hier , damit Sie eine zukünftige Referenz haben, oder? Es ist nicht unbedingt so, dass Sie das alles brauchen und ich denke, das wissen wir inzwischen. Aber ich muss nicht jedes Mal einen Tabellenclient initialisieren , wenn ich einfach meinen eingefügten Dienst verwenden kann , ähnlich wie wir es mit den Q-Clients tun mussten. Jetzt kann ich den Tabellenclient einfach direkt über diese Codebasis ausführen. Das sind also nur einige Optimierungen, die Sie an Ihrem Code vornehmen können, um sicherzustellen, dass , oh, nun, ich diesen nicht ändern muss. Also wäre diese Methode jetzt sozusagen archiviert, oder? Dies sind also einige Optimierungen und Bereinigungsaktivitäten, die Sie aufgrund einiger dieser fest codierten Verweise auf die Konfiguration entfernen können. Und dann haben wir natürlich die Tatsache besprochen , dass Sie wahrscheinlich nicht all diese Schlüssel in den App-Einstellungen speichern möchten . Du könntest also tatsächlich Geheimnisse gebrauchen. Und um Secrets zu verwenden, Sie einfach mit der rechten Maustaste auf die CSP-Image-Datei und schon können Sie die Benutzergeheimnisse verwalten. Und dann können Sie diesen Abschnitt dort hinzufügen. Es ist also niemand, der in die Quellcodeverwaltung eingecheckt wird, und es ist für neugierige Blicke nicht sofort sichtbar, aber es ist immer noch über unsere Konfiguration in unserem Startup zugänglich . Es gibt keinen Grund, warum ich beim Schließen keinen Blob-Client konfiguriere . Ich werde unseren Blob-Client nicht konfigurieren. Denken Sie daran, dass der Blob-Client anhand des Knies direkt gegen den Blob erstellt wird . Es ist zwar etwas effizienter, einfach weiterzumachen und die Service Lanes zu injizieren. Wir müssen immer noch im laufenden Betrieb einen Client erstellen der auf dem Blob basiert, der verarbeitet werden soll. Denn auch hier wissen wir nicht, welcher Blob verarbeitet werden soll, um damit zu beginnen. Sie können also überprüfen, ob dies Anreize sind und dass diese neuen Registrierungen funktionieren. Und ich werde nur einen von ihnen kommentieren. Und das war's für diese Aktivität. Lassen Sie uns dieses Modul schließen. 20. Schlussbemerkung: Also haben wir eine weitere Maske getroffen, eine und wir haben dieses Modul als Ihren Speicher abgeschlossen. Für die Dauer dieses Moduls haben wir uns mit der Erstellung und Verwaltung eines Speicherkontos befasst. Dazu mussten wir mit Blob Table und Queue Storage Services interagieren , alle Teil dieses Speicherkontoangebots von Microsoft Azure sind. Wir haben uns angesehen, wie wir das Azure-Portal oder den Speicherbrowser verwenden können , den wir auf Ihren Computer herunterladen können, um mit den verschiedenen Diensten zu interagieren. Noch einmal, Blob-Tabelle, Queue-Speicher. Wir haben also gesehen, dass wir deren Inhalte verwalten können, sei es über das Azure-Portal oder lokal mit dem Speicherbrowser. Wir haben uns auch angesehen, wie wir eine Dotnet Core-Lösung für die Verwendung des Speicherkontos entwickeln können . Also genau hier haben wir uns das Speichern und Abrufen der Verbindungszeichenfolge mit dem Speicher oder den Kegeln für das gesamte Wochenende angesehen und Abrufen der Verbindungszeichenfolge mit dem Speicher oder und Code geschrieben, um mit den verschiedenen Diensten zu interagieren und die Nuance liegt dazwischen. Und letztendlich können wir es alle darauf ankommen , dass jeder dieser Dienste über RESTful-API-Aufrufe und -Kodierungen verwaltet wird. Wir stellen lediglich HTTP-Clients bereit , um mit den zugrunde liegenden Diensten zu interagieren. Wir haben das Ganze auch abgerundet, indem wir uns angesehen haben, wie wir die asynchrone Kommunikation mithilfe von Warteschlangen ermöglichen können. Und dadurch mussten wir so etwas wie ein Pub-Sub-Pattern implementieren , bei dem wir eine Nachricht in der Warteschlange veröffentlichten. Und dann hatten wir noch eine App, die die Warteschlange abonniert hatte , die die Nachricht abholte, sie verarbeitete und weitermachte. Das ist also ein Beispiel für das Popup-Muster und wie wir asynchrone Kommunikation implementieren können. Ich danke Ihnen, dass Sie sich mir an diesem Modul angeschlossen haben. Wir sehen uns in der nächsten Lektion.