Při vytváření serverless aplikací pomocí Azure Functions je klíčové pochopit, jak správně nastavit a otestovat funkce, které reagují na HTTP požadavky. V následujícím textu se zaměříme na vytvoření jednoduché funkce Azure, která převádí čísla na slova, a ukážeme si, jak ji nakonfigurovat a otestovat.
Nejprve je potřeba zavřít pracovní prostor Chapter14, protože následující kroky budou fungovat pouze mimo pracovní prostor. Otevřete složku Northwind.AzureFunctions.Service v aplikaci Visual Studio Code. Následně otevřete příkazovou paletu (View | Command Palette) a napište „azure f“, jak ukazuje obrázek 14.1.
V seznamu příkazů Azure Functions vyberte Azure Functions: Create New Project a následně vyberte složku Northwind.AzureFunctions.Service pro vytvoření nového projektu Azure Functions. Při výběru parametrů projektu vyberte následující:
-
Jazyk: C#
-
Verze .NET: .NET 6
-
Typ triggeru pro první funkci: HTTP trigger
-
Název funkce: NumbersToWordsFunction
-
Namespace: Northwind.AzureFunctions.Service
-
Úroveň autorizace: Anonymous
Po vytvoření projektu zavřete složku v aplikaci Visual Studio Code a znovu otevřete pracovní prostor Chapter14. Poté v nabídce Terminal zvolte New Terminal a v příkazovém řádku spusťte příkaz pro sestavení projektu:
Pokud dáváte přednost použití příkazového řádku, můžete vytvořit projekt a funkci pomocí nástroje func CLI. Pro tento přístup je potřeba vytvořit složku Chapter14-cli a uvnitř ní složku Northwind.AzureFunctions.Service. Poté otevřete příkazový řádek nebo terminál a postupujte následovně:
-
Vytvořte nový projekt Azure Functions v jazyce C#:
-
Vytvořte novou funkci s HTTP triggerem a anonymní autorizací:
-
Funkci můžete také spustit lokálně:
Pokud se vám nástroj func nenačte, doporučuje se nainstalovat Azure Functions Core Tools prostřednictvím Chocolatey.
Přehled projektu Azure Functions
Před tím, než začneme implementovat funkci, je užitečné se podívat, co všechno zahrnuje projekt Azure Functions. V souboru projektu najdete verzi Azure Functions a balíčky, které jsou potřebné pro funkce, které reagují na HTTP požadavky. Také v souboru host.json si všimněte, že je povoleno logování do Application Insights, ale s výjimkou typů požadavků. Ačkoliv Application Insights je nástroj pro monitoring a logování v Azure, v tomto projektu ho nevyužíváme.
Další důležitý soubor je local.settings.json, kde je potřeba ověřit, že projekt při lokálním vývoji používá místní úložiště a hostingový model „in-process“. Pokud není nastavena proměnná AzureWebJobsStorage, je nutné ji přidat a nastavit na hodnotu „UseDevelopmentStorage=true“. Proměnná FUNCTIONS_WORKER_RUNTIME určuje jazyk použitý v projektu (pro tento projekt je to dotnet).
Implementace jednoduché funkce
Pro naši funkci, která převádí čísla na slova, použijeme implementaci, která je převzata z článku „Convert A Number into Words“ od Richarda Carra. Vytvoříme novou třídu NumbersToWords.cs a do ní vložíme téměř 200 řádků kódu, které usnadní převod čísel na slova. Kód pro tuto funkci je k dispozici na následujícím odkazu:
Pokud používáte Visual Studio 2022, přejmenujte soubor Function1.cs na NumbersToWordsFunction.cs a vložte do něj kód pro funkci, jak je ukázáno níže:
Testování funkce
Po napsání kódu můžeme funkci otestovat v našem místním vývojovém prostředí. Spusťte projekt Northwind.AzureFunctions.Service. Pokud používáte Visual Studio Code, přejděte do panelu Run and Debug, vyberte možnost „Attach to .NET Functions“ a klikněte na tlačítko Run. Pokud při spouštění uvidíte varování Windows Defender Firewall, povolte přístup.
Pokud vše proběhne správně, vaše funkce bude hostována na portu 7071 a bude možné ji volat na URL:
Funkce vrátí odpověď ve formátu slova reprezentujícího dané číslo, například „dvanáct tisíc tři sta čtyřicet pět“.
Jak implementovat funkce Azure pro reakci na různé spouštěče a získání dat z externích zdrojů
Při práci s Azure Functions, jedním z nejsilnějších nástrojů v rámci serverless architektury, se často setkáváme s potřebou implementovat funkce, které reagují na různé spouštěče. Mezi nejběžnější spouštěče patří HTTP požadavky, časovače (timer) a různé události, jako jsou změny v úložištích nebo frontách. V této části se zaměříme na implementaci funkcí, které reagují nejen na HTTP požadavky, ale také na časové události, jako je periodické volání externího API.
HTTP spouštěč: Zavolání funkce přes URL
Jednou z nejjednodušších a nejběžnějších funkcí, kterou můžeme implementovat, je funkce reagující na HTTP požadavky. Pro tento účel stačí v rámci Azure Functions použít vestavěný HTTP trigger. Proces začíná tím, že uživatel zavolá funkci prostřednictvím URL, která je automaticky vygenerována při nasazení funkce. Tento proces je velmi snadný a umožňuje rychlé prototypování.
Po zavolání URL s příslušným dotazem (například ?amount=123456), Azure Function reaguje na tento požadavek a vrátí odpověď v požadovaném formátu. Například při zadání čísla 123456 jako parametru dotazu by funkce mohla vrátit slova jako "one hundred twenty-three thousand four hundred fifty-six" (stotisíc tři sta čtyřicet pět). Tento proces je zaznamenán jak v konzoli, tak v prohlížeči, což usnadňuje ladění a ověřování správnosti.
Pokud do dotazu přidáme neplatnou hodnotu (například text nebo chybějící číslo), funkce vrátí chybu s HTTP kódem 400, což znamená špatný požadavek. Tento mechanismus zajišťuje, že aplikace bude robustní a správně reaguje na neočekávané vstupy.
Časový spouštěč: Periodické požadavky na externí služby
V některých scénářích, například pro sledování aktuálních statistik nebo stavu, je potřeba pravidelně volat externí API. V Azure Functions je možné nastavit časový spouštěč, který umožní funkci běžet v pravidelných intervalech. Například v následující implementaci se funkce spustí každou hodinu a provede HTTP GET požadavek na stránku s informacemi o knize.
Pro tento účel je zapotřebí využít službu IHttpClientFactory, která zjednodušuje správu HTTP klientů v aplikacích. Tento klient je nakonfigurován tak, aby se choval jako prohlížeč (například Chrome), což zajišťuje kompatibilitu s externími servery. Funkce bude pravidelně kontrolovat stránku Amazonu, kde sleduje hodnocení knihy podle jejího Best Sellers Rank.
Implementace s využitím závislostí a injekce
V rámci funkcí, které vyžadují externí služby, je doporučeno využívat injekci závislostí (Dependency Injection), což je standardní přístup v .NET Core. V tomto konkrétním případě se používá IHttpClientFactory, který umožňuje efektivně spravovat HTTP klienty bez potřeby opětovného vytváření instancí klienta pro každý požadavek. Tento přístup výrazně zjednodušuje správu zdrojů a zvyšuje výkon aplikace.
Pro implementaci takové funkce je nutné v projektu přidat příslušné NuGet balíčky, které zahrnují rozšíření pro práci s HTTP klienty v Azure Functions, a to jak pro základní HTTP požadavky, tak pro práci s časovači a dalšími spouštěči. Kromě toho je třeba upravit třídu pro nastavení, která bude inicializovat požadované závislosti a nakonfiguruje parametry klienta pro správné fungování požadavků.
Zpracování odpovědi a extrakce dat
Po provedení HTTP požadavku na požadovanou stránku je nezbytné správně zpracovat odpověď. V tomto konkrétním případě odpověď obsahuje komprimované údaje (GZIP), které je potřeba dekomprimovat, aby bylo možné číst obsah. Jakmile je obsah získán, musí se provést extrakce požadovaných dat. V tomto scénáři se jedná o informace o Best Sellers Rank knihy, což je hodnocení její popularity na Amazonu.
Pro efektivní extrakci těchto informací je nutné provést analýzu HTML nebo textového obsahu, který obsahuje vyhledávané informace. V tomto případě se extrahuje hodnota Best Sellers Rank, což se následně použije pro další analýzu nebo sledování trendů.
Význam a doporučení pro čtenáře
Při implementaci Azure Functions s různými typy spouštěčů je důležité chápat principy serverless architektury, která umožňuje snadné škálování a flexibilitu bez nutnosti správy infrastruktury. V praxi to znamená, že je možné snadno reagovat na různé události, ať už jde o požadavky z webových aplikací, nebo o plánované úkoly, jako jsou periodické požadavky.
Při práci s Azure Functions je také kladeno důraz na správnou správu závislostí, což usnadňuje správu zdrojů a zabezpečuje efektivní využívání systémových prostředků. Implementace funkcí by měla vždy zohledňovat nejen potřebu vysoce dostupné a škálovatelné aplikace, ale také optimalizaci pro úsporu nákladů.
Pro efektivní použití Azure Functions je důležité se seznámit s různými typy spouštěčů a jejich konfigurací, ale také s možnostmi jejich ladění a monitorování, které poskytují Azure Tools. Při práci s externími API je kladeno důraz na správnou manipulaci s odpověďmi a možnými chybovými stavy, které mohou nastat při komunikaci se vzdálenými servery.
Jak optimalizovat data a úroveň konzistence v Azure Cosmos DB pro různé aplikace
Při práci s databázemi v cloudu, jako je Azure Cosmos DB, je důležité správně zvolit způsob, jakým budou data organizována a jaká bude jejich konzistence. Dvě klíčové oblasti, na které je třeba se zaměřit, jsou normalizace dat a volba úrovně konzistence. Obě tyto volby mají přímý dopad na výkon aplikace a spolehlivost jejích operací. Zde se zaměříme na to, jak tyto aspekty správně nastavit pro efektivní využívání Azure Cosmos DB.
Normalizace dat je klíčová v případě, že se data často mění nebo jsou propojena v režimu "mnoho k jednomu" nebo "mnoho k mnoha". Příklad může být aplikace, která zobrazuje novinky s komentáři nebo akcie, kde se cena často aktualizuje. V těchto případech není efektivní ukládat všechny komentáře nebo všechny ceny přímo v hlavní databázi, protože časté aktualizace by zbytečně zvyšovaly nároky na úložný prostor a výkon. Místo toho lze využít techniku referencování, kdy jsou související data ukládána separátně a k hlavnímu záznamu se připojují pomocí identifikátorů, tedy pomocí klíčů primárních záznamů. Tento přístup snižuje nároky na přímé čtení a zápis a zároveň umožňuje efektivní správu dat, která se často mění.
Takovéto řešení je ideální pro dlouhodobé investice, například akcie, jejichž historické ceny chcete uchovávat, ale aktuální cena je spíše referenční a zobrazuje se odděleně. Pro investice, které se obchodují v reálném čase, je vhodné využívat dynamicky se měnící data, která jsou ukládána odděleně a aktualizována podle potřeby. Normalizace tedy přináší zjednodušení při správě velkých objemů dat, zejména když je třeba často přistupovat k různým částem dat.
Dalším klíčovým aspektem je volba úrovně konzistence. Azure Cosmos DB poskytuje několik možností, jak zajistit, aby vaše data byla v souladu napříč různými geografickými oblastmi. Důležitým kompromisem je mezi dostupností a konzistencí. Například při výběru silné konzistence (linearizability) dochází k vyšší latenci při zápisech, ale zajišťuje se, že všechny čtecí operace vždy zobrazí nejnovější verzi dat. Tento přístup je vhodný v situacích, kde je absolutní konzistence nezbytná, například při sledování kritických finančních transakcí.
Na druhé straně relaxované úrovně konzistence, jako je konečná (eventual consistency), nabízejí rychlejší čtení, ale mohou způsobit, že čtecí operace zobrazí starší verze dat, než byly skutečně zapsány. Tento typ konzistence je ideální pro aplikace, které nejsou tak citlivé na okamžité změny, jako jsou například sociální sítě nebo e-commerce stránky, kde malý časový rozdíl mezi zápisem a čtením dat neovlivňuje uživatelskou zkušenost.
Azure Cosmos DB podporuje různé úrovně konzistence, které umožňují přizpůsobit chování databáze specifickým požadavkům aplikace. Silná konzistence garantuje, že všechny čtecí operace na globálních uzlech vrátí nejaktuálnější verzi dat. Bounded staleness a session konzistence pak nabízejí flexibilitu při zachování určité úrovně konzistentnosti bez vysokých nároků na výkon. Tento výběr by měl být vždy zvažován s ohledem na typ aplikace a specifické obchodní potřeby.
Další výzvou je správné nastavení hierarchie komponent v Azure Cosmos DB. Systém je strukturován tak, že máte možnost vytvářet více úrovní (účty, databáze, kontejnery, partition a položky), přičemž každá úroveň má svůj význam a funkci. Správná volba partition key je zásadní pro efektivní správu dat a jejich distribuci napříč fyzickými i logickými partičkami. Chybný výběr klíče může vést k špatnému výkonu a neefektivnímu rozdělení dat, což může negativně ovlivnit časové reakce aplikace.
Při konfiguraci propustnosti (throughput) je důležité odhadnout, jaký objem operací bude potřeba zvládnout v různých obdobích roku. Například při obdobích vysoké zátěže, jako jsou svátky nebo výprodeje, může být potřeba zrychlit poskytování služeb a zvýšit počet rezervovaných jednotek (RU/s). Cosmos DB umožňuje flexibilně upravit propustnost podle aktuálních potřeb, ale je nutné předem odhadnout potřebnou kapacitu pro efektivní provoz aplikace.
Jedním z faktorů, které ovlivňují náklady na provoz Azure Cosmos DB, je velikost položek, počet indexovaných vlastností, úroveň konzistence a složitost dotazů. Čím větší je dokument a složitější dotaz, tím více "request units" (RU) budou náklady na operace vyžadovat. To je důležitý aspekt pro optimalizaci nákladů, zejména u aplikací s velkým objemem dat nebo složitými dotazy.
Endtext
Jak vygenerovat PDF soubor v C# pomocí třetích stran
V rámci projektu GeneratingPdf.App je třeba nejprve vytvořit složku s názvem "images" a stáhnout do ní osm obrázků kategorií (1 až 8) z následujícího odkazu: GitHub - markjprice/apps-services-net7. Jakmile jsou obrázky staženy, je nutné je vložit do složky GeneratingPdf.App\bin\Debug\net7, pokud používáte Visual Studio 2022. Tento krok je důležitý pro správné umístění obrázků při generování PDF souboru.
V Solution Exploreru je potřeba vybrat všechny obrázky a v sekci Properties nastavit parametr Copy To Output Directory na hodnotu Copy Always. Takto se zajistí, že obrázky budou kopírovány do výstupní složky projektu. Následně je nutné otevřít soubor projektu a ověřit, zda jsou správně uvedeny záznamy pro kopírování obrázků do požadovaného adresáře.
Dále je potřeba importovat třídu System.Console globálně do projektu a přidat referenci na knihovnu, která poskytuje šablony pro dokumenty (např. GeneratingPdf.Document). Po dokončení těchto kroků je nutné projekt zkompilovat.
V souboru Program.cs je pak třeba smazat existující příkazy a přidat nové, které vytvoří model katalogu, předají ho do dokumentu katalogu, vygenerují PDF soubor a pokusí se otevřít tento soubor pomocí příkazu operačního systému. Kód pro tento proces vypadá následovně:
Po spuštění konzolové aplikace se vygeneruje PDF soubor, který je zobrazen v aplikaci podle obrázku z příkladu. Tento proces využívá knihovnu QuestPDF, která je výkonným nástrojem pro generování PDF souborů na základě modelu dat. Kromě toho by měl uživatel věnovat pozornost metodě Process.Start, která umožňuje otevření vygenerovaného souboru na různých operačních systémech. U Windows je přímo použito "explorer.exe", ale na Macu nebo Linuxu může být potřeba upravit cestu k aplikaci pro otevření souboru, což je volitelný úkol pro čtenáře.
Tento proces generování PDF souborů je silně spojen s používáním externích knihoven a je důležité rozumět, jak fungují třetí strany, jako například ImageSharp pro manipulaci s obrázky, Serilog pro logování, nebo AutoMapper pro mapování objektů. Tyto knihovny výrazně zjednodušují práci při vývoji aplikací a ušetří spoustu času a námahy.
Je také důležité si uvědomit, že proces práce s externími knihovnami a jejich integrace do vlastního projektu není vždy bezproblémová. Každý balíček má své specifické nastavení a může vyžadovat zvláštní pozornost při konfiguraci cesty k souborům nebo při ladění chybových hlášení. V případě, že aplikace nefunguje, jak má, je klíčové ověřit správné nastavení všech cest k souborům, referencí a metod pro generování výstupního souboru.
Další významnou částí tohoto procesu je učení se manipulaci s PDF soubory, jejich generováním a následným otevřením. Tento proces je často používán v podnikových aplikacích, které generují dokumenty, faktury nebo reporty na základě různých datových modelů. Kromě toho může být užitečné prozkoumat možnosti úpravy generovaných dokumentů, například přidání obrázků, změna formátu textu nebo implementace dalších interaktivních prvků v PDF.
Jak efektivně využívat moderní nástroje .NET pro vývoj aplikací a služeb
V této knize se setkáte s několika styly textu, které rozlišují různé typy informací. Tyto styly slouží k zajištění jasnosti a přehlednosti, a jejich správné použití je klíčem k efektivnímu porozumění a práci s technologiemi .NET.
Jedním z takových stylů je CodeInText, který označuje kódová slova v textu, názvy databázových tabulek, složek, názvy souborů, přípony souborů, cesty, fiktivní URL adresy a uživatelská jména na sociálních sítích. Příklad: "Složky Controllers, Models a Views obsahují třídy ASP.NET Core a soubory .cshtml pro provedení na serveru." Pokud byste pracovali s kódem, můžete narazit na bloky kódu, jako je tento:
Pokud chcete zvýraznit určité řádky nebo položky v bloku kódu, můžete použít následující zápis:
Příkazový řádek je označen následovně: dotnet new console.
Dalším důležitým stylem je Bold, který používáme pro označení nových termínů, klíčových slov nebo textu, který se objevuje na obrazovce, například v menu nebo dialogových oknech. Příklad: "Kliknutím na tlačítko Next přejdete na další obrazovku."
Je rovněž běžné využívat Good Practice, což jsou doporučení pro správné a efektivní psaní kódu. Tento styl textu pomáhá čtenářům osvojit si osvědčené postupy a vyhnout se běžným chybám.
Pokud čelíte nějakým problémům, kniha obsahuje i odkazy na externí zdroje pro další studium. Doporučuji pravidelně se podívat na novinky v dokumentaci a fórum, kde můžete najít odpovědi na často kladené otázky nebo přispět vlastními zkušenostmi.
Pro začínající vývojáře může být přínosné zaměřit se na nastavení vývojového prostředí a seznamování s novinkami ve verzi C# od 8 do 11 a .NET Core od 3.1 až po .NET 7. Správné nastavení vašeho vývojového prostředí, včetně Visual Studio 2022 a Visual Studio Code, je základem pro efektivní práci s těmito technologiemi. GitHub repozitář knihy obsahuje všechny příklady kódu, které vám umožní snadno se s textem a příklady seznámit. Všechny projekty najdete na adrese: https://github.com/markjprice/apps-services-net7/.
Při používání Visual Studio Code v prohlížeči můžete porovnávat svůj kód s řešením v reálném čase a snadno přebírat části kódu podle potřeby. Toto je užitečné zejména pro učení a ladění problémů.
V této knize používám termín moderní .NET pro označení .NET 7 a jeho předchůdců jako .NET 5 a .NET 6, které vycházejí z .NET Core. Naopak legacy .NET označuje starší platformy jako .NET Framework, Mono, Xamarin a .NET Standard. Moderní .NET je unifikací těchto starších platforem a standardů. Důležité je si uvědomit, že moderní .NET není jen evoluce, ale skutečná integrace dřívějších samostatných platforem, což usnadňuje přechod a migraci aplikací mezi nimi.
Pokud jste již získali základy v předchozích knihách o C# a .NET, tato kniha se zaměřuje na pokročilé techniky a praktické schopnosti, jak vyvíjet aplikace a služby v reálném světě. Naučíte se chránit svá data pomocí šifrování, podepisování a autentizace, stejně jako používat různé knihovny a technologie pro správu dat, například SQL Server a Azure Cosmos DB.
Až budete mít zkušenosti s těmito základy, budete moci přistoupit k rozvoji složitějších aplikací, jako jsou webové API pomocí ASP.NET Core, a vytvářet efektivní a bezpečné služby s využitím OData, GraphQL, gRPC a dalších technologií. Pokročilé uživatelské rozhraní můžete tvořit s pomocí Blazor WebAssembly a .NET MAUI, což umožňuje vytvářet aplikace napříč různými platformami.
Když budete procházet tímto materiálem, pamatujte na to, že se nejedná pouze o technické návody, ale o filozofii učení, která se zakládá na opakování a zkoušení. Je důležité se nebát experimentovat a vyhledávat si vlastní řešení, pokud něco nefunguje tak, jak by mělo. Jen tak si skutečně osvojíte znalosti a získáte důvěru při práci s těmito technologiemi.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский