Wprowadzenie do platformy Azure – utworzenie aplikacji ASP.NET Web API wspomaganej bazą Azure SQL Server
Tworzenie projektu ASP.NET Core 5.0 Web API
Utworzenie nowego projektu ASP.NET Core
1. Uruchamiamy wiersz poleceń jako administrator (command prompt wywoływany za pomocą polecenia cmd):
2. Tworzymy nowy projekt ASP.NET Core Web API. W tym celu w wierszu poleceń wpisujemy poniższe polecenie i klikamy przycisk Enter. Polecenie to utworzy nam nowy projekt o nazwie BlueYonder.Flights na dysku C w folderze Azure:
dotnet new webapi --name BlueYonder.Flights --output C:\Azure\BlueYonder.Flights
3. Jak już projekt zostanie utworzony, zmieniamy domyślny folder wiersza poleceń na nasz folder z projektem za pomocą następującego polecenia:
cd C:\Azure\BlueYonder.Flights
Utworzenie modelu Entity Framework Core
1. Abyśmy mogli używać Entity Framework Core w naszym projekcie, potrzebujemy zainstalować odpowiedni pakiet przy użyciu poniższego polecenia:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
2. Aby przywrócić wszystkie pakiety i biblioteki, wymagane w naszym projekcie, uruchamiamy poniższe polecenie z poziomu wiersza poleceń:
dotnet restore
3. Aby otworzyć naszą aplikację w Visual Studio Code, w wierszu poleceń wpisujemy poniższe polecenie:
code .
4. Folder z naszym projektem BlueYonder.Flights został otwarty w Visual Studio Code:
-
- Klikamy Yes przy wiadomości Required assets to build and debug are missing from 'BlueYonder.Flights’.Add them?. Pozwoli to na zbudowanie (ang. build) naszego projektu i sprawdzenie, czy nie ma błędów w kodzie.
- Jeśli pojawi się informacja There are unresolved dependencies, klikamy opcję Restore:
5. Prawym przyciskiem myszy klikamy wewnątrz panelu File Explorer po lewej stronie i wybieramy opcję New Folder, a następnie nazywamy go Models:
6. Prawym przyciskiem myszy klikamy na folderze Models, wybieramy opcję New C# Class i nazywamy ją Flight.cs. Opcja New C# Class jest dostępna dzięki rozszerzeniu do VS Code „C# Extensions”, autor: jchannon:
7. Na górze klasy dodajemy następującą przestrzeń (ang. namespace):
using System;
8. Aby nasz model spełniał swoje zadanie, dodajemy następujące właściwości do klasy Flight:
public int Id { get ;set; } public string Origin { get; set; } public string Destination { get; set; } public string FlightNumber { get; set; } public DateTime DepartureTime { get; set; }
Stworzenie klasy DbContext
1. Prawym klikamy folder Models, wybieramy opcję New C# Class, a potem nazywamy ją FlightsContext.cs:
2. Na górze pliku FlightsContext.cs dodajemy następującą przestrzeń:
using Microsoft.EntityFrameworkCore;
3. Nasza klasa FlightsContext będzie dziedziczyła z klasy DbContext, więc po nazwie klasy dodajemy takie dziedziczenie:
public class FlightsContext : DbContext
4. Wewnątrz klasy dodajemy konstruktor i właściwość Flights, która będzie zapewniała nam dostęp do naszych danych, przy użyciu następującego kodu:
public FlightsContext(DbContextOptions<FlightsContext> options) : base(options) { } public DbSet<Flight> Flights { get; set; }
5. Przechodzimy do klasy Startup.cs i dodajemy następujące przestrzenie:
using BlueYonder.Flights.Models; using Microsoft.EntityFrameworkCore;
6. W metodzie ConfigureServices dodajemy połączenie (ang. connection string) do bazy danych Microsoft SQL Server, którą zaraz utworzymy w chmurze Azure:
services.AddDbContext<FlightsContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("defaultConnection")));
Stworzenie kontrolera dla Web API
1. Prawym przyciskiem myszy klikamy na folderze Controllers i wybieramy opcję New C# Class. Nazywamy naszą klasę FlightsController.cs:
2. Dodajemy referencję do folderu Models:
using BlueYonder.Flights.Models;
3. Dodajemy pole prywatne _context :
private readonly FlightsContext _context;
4. Aby wstrzyknąć kontekst bazy danych do kontrolera (inaczej mówiąc pozwolić na to, aby metody z naszego kontrolera mogły używać naszej bazy danych i operować na danych), używamy do tego konstruktora jak poniżej:
public FlightsController(FlightsContext context) { _context = context; }
Stworzenie akcji i użycie kontekstu Entity Framework Core
1. Aby pobrać listę wszystkich lotów, dodajemy metodę Get, w której użyjemy pola _context, dzięki któremu połączymy się do naszej bazy danych i z tabeli dbo.Flights pobierzemy wszystkie loty i zwrócimy je w postaci listy:
// GET api/flights [HttpGet] public IEnumerable<Flight> Get() { return _context.Flights.ToList(); }
2. Do kontrolera dodajemy 3 nowe przestrzenie nazw (ang. namespaces):
using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc;
3. Aby dodać nowy przelot i zapisać go w bazie danych, dodajemy metodę Post, która w parametrze flight będzie przekazywała właściwości z modelu Flight, a następnie dodawała ten nowy lot do innych lotów. Następnie zapisujemy lot do bazy danych, za pomocą metody SaveChanges wracamy do akcji Get, która ma wyświetlić nam dodany właśnie przelot:
// POST api/flights [HttpPost] public IActionResult Post([FromBody]Flight flight) { _context.Flights.Add(flight); _context.SaveChanges(); return CreatedAtAction(nameof(Get), flight.Id); }
4. Nad klasą kontrolera dodajemy atrybut [Route(„api/[controller]”)] oraz dodajemy dziedziczenie z klasy ControllerBase, aby wskazać, że to jest API controller:
public class FlightsController : ControllerBase
Wdrożenie aplikacji na platformę Azure
Stworzenie Azure Web App i bazy danych Azure SQL Server
1. Otwieramy przeglądarkę.
2 Przechodzimy do adresu https://portal.azure.com.
3. Jeśli strona poprosi o dane do logowania, wpisujemy adres email, klikamy przycisk Next (Następny), wpisujemy hasło, a potem klikamy przyciskSign In (Zaloguj się).
4. Jeśli pojawi się okno z pytaniem Stay signed in?, klikamy Yes:
Uwaga: Jeśli podczas procesu logowania zostanie wyświetlona strona z monitem o wybranie konta z listy wcześniej używanych kont, wybieramy konto, z którego wcześniej korzystaliśmy, a następnie kontynuujemy podawanie swoich poświadczeń.
5. Aby wyświetlić wszystkie zasoby na Azurze, klikamy przycisk +Create a resource:
6. Aby wybrać szablon dla app service, w oknie Create a resource, w polu wyszukiwania wpisujemy Web App + SQL i wybieramy z podpowiedzi szablon Web App + SQL:
7. W oknie Web App + SQL, klikamy przycisk Create:
8. W oknie WebApp + SQL wypełniamy następujące pola:
- W polu App Name, wpisujemy nazwę blueyonderflightsbz:
Uwaga: Nazwa App Name będzie częścią URL i będzie obsługiwana przez domenę azurewebsites.net. Nazwa naszej aplikacji musi być unikalna w obrębie domeny. Możemy także skonfigurować na Azurze ustawienia dla naszej własnej domeny i wtedy nazwa taka musi być unikalna w obrębie naszej domeny.
- Wybieramy subskrypcję.
- W Resource Group, klikamy link Create new, and potem wpisujemy nazwę grupy zasobów BlueYonderFlightsRG i klikamy OK:
- W polu App Service plan/Location klikamy znak > po prawej stronie:
- Klikamy przycisk + Create new:
- W oknie New App Service Plan w polu App Service Plan wpisujemy BlueYonderFlightsPlan, z listy rozwijanej Location wybieramy lokalizację, w której chcemy hostować naszą aplikację:
- Klikamy strzałkę po prawej stronie obok pozycji Pricing tier. Na stronie Spec Picker możemy wybrać parametry hostingu dla naszej aplikacji. Na zakładce Dev/Test wybieramy maszynę F1 (zapewni nam to darmowe użytkowanie aplikacji przez godzinę dziennie) i klikamy Apply:
- W oknie New App Service Plan klikamy przycisk OK:
- Na stronie Web App + SQL klikamy znak > po prawej obok pola SQL Database:
- W oknie SQL Database wpisujemy następujące informacje:
- W polu Name wpisujemy BlueYonderFlightsDB.
- Klikamy link Select Server poniżej Target server:
- W oknie New server wpisujemy następujące informacje:
- W polu Server name wpisujemy blueyonderflightsserverdbbz.
Uwaga: Nazwa serwera powinna być unikalna w ramach domeny .database.windows.net.
-
- W polu Server admin login wpisujemy Admin123.
- W polach Password i Confirm password wpisujemy silne hasło.
- W polu Location wybieramy lokalizację, w którym chcemy hostować naszą bazę danych.
- Klikamy przycisk Select.
- Klikamy link Configure database pod polem Pricing tier:
- Wybieramy opcję Serverless i klikamy przycisk Apply:
Uwaga: W opcji Serverless opłaty są naliczane co sekundę w oparciu o zużycie vCores. W opcji Provisioned opłaty są naliczane co godzinę w oparciu o wcześniej zadeklarowaną liczbę vCores i wielkość miejsca na przechowywanie danych. Możemy także wybrać inne rodzaje i wielkości baz danych, w tym bazę darmową po kliknięciu na link Looking for basic, standard, premium?:
- Klikamy przycisk Select:
- Klikamy przycisk Create:
9. Po utworzeniu bazy danych, aby przejść do naszej bazy danych, po lewej stronie klikamy na menu, a potem wybieramy SQL Databases:
10. W oknie SQL databases klikamy na link prowadzący do naszej bazy danych:
11. W oknie bazy danych klikamy na zakładce Overview klikamy przycisk Set server firewall na pasku na środku pod nazwą naszej bazy danych:
12. W oknie Firewall settings klikamy przycisk + Add client IP. W regułach zostaje nam dodany nasz adres IP, który pozwoli na połączenie do bazy danych. Klikamy przycisk Save, a potem przycisk Continue:
13. Na samej górze klikamy link do naszej bazy danych, aby powrócić na zakładkę Overview. W panelu po lewej stronie klikamy Query editor (preview):
14. Klikamy Login, wpisujemy nasze hasło, a potem klikamy OK:
15. Aby stworzyć nową tabelę w naszej bazie, wewnątrz zakładki Query 1, wklejamy następujący skrypt i klikamy przycisk Run:
CREATE TABLE [dbo].[Flights]( [Id] [int] IDENTITY(1,1) NOT NULL, [Origin] [varchar](50) NOT NULL, [Destination] [varchar](50) NOT NULL, [FlightNumber] [varchar](50) NOT NULL, [DepartureTime] [date] NOT NULL, PRIMARY KEY CLUSTERED ( [Id] ASC )); GO
16. Zamykamy zakładkę Query 1 i w bazie danych sprawdzamy, czy nasza tabela jest widoczna:
Wdrożenie Azure Web App
1. Wracamy na stronę główną Azure Portal klikając link Home w lewym górnym rogu.
Uwaga: Jeśli pojawi się nam takie okno dialogowe klikamy przycisk OK:
2. Aby wyświetlić nasz App Service, klikamy menu po lewej stronie i wybieramy App Services:
3. Żeby zobaczyć konfigurację naszego w zakładce App Services klikamy link do naszej aplikacji:
4. Aby dodać poświadczenia, dzięki którym będziemy mogli wdrożyć naszą aplikację do app service, pod sekscją DEPLOYMENT klikamy Deployment Center, a potem przechodzimy na zakładkę FTPS Credentials:
5. W sekcji User scope dodajemy następujące dane:
-
- W FTP/deployment username wpisujemy FTPBlueYonderFlightsUserBZ.
- W polach Password i Confirm password wpisujemy złożone hasło.
- Klikamy Save:
Uwaga: Powyższe poświadczenia udostępniają opcje wdrażania aplikacji z wiersza polecenia.
6. W panelu po lewej stronie w sekcji Monitoring klikamy App Service Logs i zapisujemy w notatniku nazwę FTP/deployment username:
7. Przełączamy się do Visual Studio Code.
8. Klikamy prawym przyciskiem myszy w panelu File Explorer po lewej stronie, wybieramy folder Properties.
9. Klikamy prawym przyciskiem myszy na folderze Properties, wybieramy New Folder i nazywamy ten folder PublishProfiles.
10. Do folderu PublishProfiles dodajemy plik Azure.pubxml:
11. Wklejamy następujący kod, modyfikując odpowiednio nazwy PublishSiteName (FTP z notatnika) i Username (deployment username z notatnika) :
<Project> <PropertyGroup> <PublishProtocol>Kudu</PublishProtocol> <PublishSiteName>blueyonderflights{TwojeInicjały}</PublishSiteName> <UserName>FTPBlueYonderFlightsUser{TwojeInicjały}</UserName> <Password>Pa55w.rd12345</Password> </PropertyGroup> </Project>
12. W wierszu poleceń wklejamy następującą komendę:
dotnet publish /p:PublishProfile=Azure /p:Configuration=Release
Uwaga: W przypadku, kiedy Publish nie przechodzi, należy zrestartować app service blueyonderflightsbz na Azurze (zakładka Overview). Po uruchomieniu możemy zobaczyć pustą tablicę jako rezultat:
Test Web API
1. Przechodzimy do portalu Azure.
2. Po lewej stronie klikamy SQL Databases.
3. Klikamy nazwę naszej bazy danych, a po przejściu do bazy danych po lewej stronie klikamy Query editor(preview).
4. Klikamy Login, a następnie wpisujemy nasze hasło.
5. W oknie klikamy +New Query i wywołujemy następujące polecenie, które stworzy nam 6 lotów:
INSERT INTO dbo.Flights(Origin, Destination, FlightNumber, DepartureTime) VALUES('Paris', 'London', 'ABC123', '2021-06-13'), ('London', 'Warsaw', 'WEQ675', '2021-06-14'), ('Warsaw', 'New York', 'JHE543', '2021-06-15'), ('New York', 'Washington', 'CXD654', '2021-06-16'), ('Washington', 'Miami', 'MNK098', '2021-06-17'), ('Miami', 'Paris', 'DCT543', '2021-06-18'); GO
6. Aby pobrać wszystkie przeloty z bazy danych, wklejamy następujący skrypt do Query 1, and potem klikamy Run:
Select * from dbo.Flights; GO
7. Jeśli odświeżymy naszą aplikację, możemy zobaczyć, że aplikacja także zwraca nasze przeloty:
W ten oto sposób stworzyliśmy aplikację, za pomocą której możemy odczytać dane z bazy AzureSQL Server.
Gotowa aplikacja do pobrania z mojego Githuba.