V modelu MVC (Model-View-Controller) je základním prvkem správná komunikace mezi Views a HTML. Tento přístup následuje určitou konvenci, která zjednodušuje vývoj a organizaci aplikace, a zároveň umožňuje přizpůsobení, pokud to vývojář vyžaduje. Platforma ASP.NET Core MVC dává vývojářům možnost úpravy prostředí, aby splnilo specifické požadavky projektu.

V souboru program.cs projektu MVC se nachází malá odlišnost ve srovnání s Razor Pages. Před vykonáním metody app.Run() je volána metoda app.MapControllerRoute, která je zodpovědná za konfiguraci aplikace. Tato metoda definuje směrování, které říká aplikaci, jak reagovat na různé požadavky uživatele. Nejčastěji používaný vzorec směrování v MVC vypadá následovně:

csharp
app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");

Tento vzorec definuje výchozí směrování, kde controller je přiřazen hodnotě Home, action hodnotě Index a id je volitelné. Jakmile uživatel neudá, který controller a akci požaduje, aplikace vykoná výchozí controller Home a akci Index. Tato konvence umožňuje jednodušší navigaci a přehlednost v aplikaci.

Je důležité si uvědomit, že v MVC mluvíme o controllerech, nikoliv o stránkách, což je klíčové rozlišení. Controller v MVC vzoru funguje jako orchestrátor mezi Modelem a View, což znamená, že přijímá požadavky a určuje, jaký typ odpovědi nebo View bude vrácen uživatelskému rozhraní.

Ve třídě Controller jsou definovány metody, které se nazývají akce (actions), a které vykonávají logiku aplikace. Tyto akce mohou vracet různé výsledky: HTML stránky (View), data ve formátu JSON nebo provést přesměrování na jinou akci či stránku.

Příklad třídy PersonController ukazuje, jak se ve MVC definuje logika pro práci s modelem a view:

csharp
public class PersonController : Controller
{ public IActionResult Index() { return View(); } public JsonResult GetPeople() { var model = new List<PersonModel>() { new PersonModel("Person 1", new DateTime(1980, 12, 11)),
new PersonModel("Person 2", new DateTime(1983, 12, 15))
};
return Json(model); } public IActionResult Register(PersonModel personModel) { return RedirectToAction("Result", new { message = $"The {personModel.Name} was registered successfully." }); }
public IActionResult Result(string message)
{ ViewData[
"Message"] = message; return View(); } }

Ve výše uvedeném příkladu se použijí různé metody: View() pro vrácení stránky, Json() pro vrácení dat ve formátu JSON a RedirectToAction() pro přesměrování na jinou akci. Každá metoda ovlivňuje chování aplikace a určuje, jaký typ odpovědi uživatel dostane. Například metoda GetPeople() vrací seznam lidí v JSON formátu, zatímco Register() zpracovává formulář a následně přesměruje uživatele na stránku s potvrzením.

Základní třída Controller obsahuje metody, které usnadňují komunikaci mezi Controllerem a View. Mezi nejběžněji používané metody patří Json(), View() a RedirectToAction(). Tato třída tak výrazně zjednodušuje vývoj aplikací a umožňuje čistý a přehledný kód.

V tomto modelu není konceptuálně vymezený pojem „stránky“ (Pages) jako v Razor Pages. Místo toho se používají akce (Actions), které reagují na různé uživatelské interakce. V tomto kontextu Controller rozhoduje, jaký typ View nebo data bude vrácen na základě interakce uživatele. To poskytuje velkou flexibilitu v návrhu a implementaci webové aplikace.

Jak fungují Views v ASP.NET MVC

V MVC je pojem View obdobný tomu, jak je definován v Razor Pages. Views jsou soubory, které používají Razor syntaxi k vykreslení HTML kódu na základě dat získaných z Modelu. Každá View odpovídá určité akci Controlleru a obvykle se nachází v adresáři Views/{ControllerName}/{ActionName}.cshtml.

Pro zajištění silné typizace a bezpečnosti při práci s daty se v aplikaci používají modely. Když je v View použit model, zajišťuje to správné propojení mezi HTML formáři a daty, které se zpracovávají v Controlleru. Například v souboru Index.cshtml je model definován takto:

csharp
@model MyFirstMVCApp.Models.PersonModel @{ ViewData["Title"] = "Home Page"; } <form asp-action="Register" method="post"> @Html.LabelFor(p => p.Name) @Html.TextBoxFor(p => p.Name) @Html.LabelFor(p => p.DateOfBirth) @Html.TextBoxFor(p => p.DateOfBirth) <button type="submit">Register</button> </form>

V tomto příkladu se používají tag helpers, které generují HTML kód na základě údajů z modelu. Například @Html.LabelFor(p => p.Name) generuje HTML tag pro label, který je spojen s vlastností Name v modelu PersonModel. Tento přístup je typickým způsobem, jakým se data modelu propojují s HTML formuláři.

Důležitým pravidlem v MVC je dodržování konvencí pro názvy. Například soubor Index.cshtml by měl být vždy součástí adresáře odpovídajícího názvu Controlleru, což usnadňuje udržitelnost a organizaci kódu. V případě controlleru PersonController by View soubor pro akci Index měl být umístěn v cestě Views/Person/Index.cshtml.

Důležitou součástí dobré praxe je použití akce Index() ve všech controllerech. Pokud uživatel neudá konkrétní akci, výchozí akce Index() bude automaticky vykonána, což zajišťuje hladkou navigaci aplikace a předchází problémům s použitelností.


Jak efektivně hostovat aplikace SignalR v ASP.NET Core

ASP.NET Core SignalR je nástroj pro vytváření real-time aplikací, které umožňují obousměrnou komunikaci mezi klientem a serverem. Tento mechanismus je neocenitelný pro aplikace, které vyžadují okamžité aktualizace, jako jsou chatovací aplikace, hry v reálném čase, nebo monitoring systémů. Přestože je vývoj aplikací SignalR velmi silný a přitahuje pozornost vývojářů, důležitou součástí tohoto procesu je i efektivní hostování těchto aplikací na serverech, což zahrnuje několik klíčových aspektů, které si vyžadují pozornost.

Aplikace SignalR mají specifické požadavky na infrastrukturu, protože udržují trvalé spojení mezi klientem a serverem. Tento přístup znamená, že aplikace může výrazně zatížit serverové prostředky, což vyžaduje pečlivé plánování a správu hostování. Hosting SignalR aplikací se v základu příliš neliší od hostování běžných ASP.NET Core aplikací, ale jsou zde některé specifické aspekty, které je třeba zohlednit, aby aplikace fungovala efektivně i při vysokém počtu souběžných uživatelů.

Prvním krokem je rozhodnutí, kde aplikaci hostovat. V současnosti je běžné využívat veřejné cloudové platformy jako Azure, AWS nebo Google Cloud, které nabízí škálovatelné a robustní prostředí pro hostování aplikací. Pro ASP.NET Core aplikace je však možné zvolit i tradiční hostingové servery, jako jsou IIS, Nginx nebo Apache, které fungují jako reverzní proxy pro SignalR aplikace. Tento způsob funguje tak, že servery přeposílají požadavky klienta na správnou instanci aplikace.

Pro samotné hostování aplikace SignalR je potřeba splnit několik základních kroků. Nejdříve je nutné aplikaci publikovat, což lze provést buď pomocí Visual Studio, nebo příkazového řádku .NET CLI. Tento proces generuje balíček aplikace, který lze nasadit na server. Dále je nutné správně nakonfigurovat server nebo cloudovou službu, aby aplikace fungovala podle očekávání. Například na serverech IIS je potřeba nastavit správné verze .NET runtime a ujistit se, že webový server je správně nakonfigurován pro komunikaci se SignalR aplikací.

Dalším klíčovým krokem je konfigurace reverzní proxy, pokud to je potřeba. Na serverech jako IIS, Nginx nebo Apache musí být proxy nakonfigurována tak, aby správně přeposílala požadavky na SignalR aplikaci. Tato konfigurace je nezbytná pro zajištění udržování trvalých spojení mezi klientem a serverem, což je základní funkce SignalR. Jakmile je aplikace publikována a server správně nakonfigurován, je čas aplikaci nasadit na server. To může být provedeno pomocí FTP, Web Deploy, nebo pomocí CI/CD pipeline, pokud používáte cloudové služby nebo kontejnerizované prostředí.

Je však nutné mít na paměti, že SignalR aplikace generují specifické nároky na serverové zdroje kvůli udržování trvalých spojení mezi klientem a serverem. Každý server má limit pro počet souběžných připojení, která dokáže zpracovat. To je třeba zvážit při výběru hostovacího plánu nebo při konfiguraci serveru. Pokud aplikace používá load balancing, je doporučeno nastavit sticky sessions, což znamená, že klient bude komunikovat s touto konkrétní instancí serveru během celé doby spojení.

Při zvyšujícím se počtu souběžných připojení může být potřeba rozšířit aplikaci, což obvykle zahrnuje nasazení více instancí aplikace a rovnoměrné rozdělení zátěže mezi ně. Tato metoda zajišťuje, že aplikace bude schopna efektivně zpracovávat větší objem souběžných uživatelů a zároveň udrží optimální výkon a spolehlivost i při vysokém zatížení.

Zajímavým přístupem je i využití kontejnerizace (například Dockeru nebo Kubernetes). Tento způsob umožňuje balíčkování aplikace společně se všemi jejími závislostmi, čímž se zajistí konzistentní provoz v různých prostředích. Kontejnerizace také umožňuje větší kontrolu nad prostředím, což je výhodné pro složitější aplikace a scénáře, kde je potřeba rychle škálovat nebo reagovat na změny v prostředí.

Ačkoli hostování aplikací SignalR přináší určité specifické výzvy, samotný proces hostování není zásadně odlišný od hostování běžných webových aplikací. Pro efektivní práci s aplikacemi SignalR je klíčové pochopit nejen technické aspekty hostování, ale také si uvědomit, jakým způsobem real-time komunikace ovlivňuje výkon serveru a jakým způsobem správně škálovat aplikace, aby byly schopny zvládnout i náročnější požadavky.

Pro čtenáře, kteří se chtějí podívat na hlubší aspekty této problematiky, je užitečné se zaměřit na koncepty jako jsou load balancing, sticky sessions a efektivní správu prostředí při vysokém zatížení. Dále je vhodné se seznámit s technikami pro diagnostiku a monitorování výkonu serverů, které hostují SignalR aplikace, aby bylo možné rychle identifikovat a řešit potenciální problémy s výkonem nebo stabilitou.