MVC 70-486: Chapter 1

Objective 1.1: Design the application architecture

Routes and routing

De routing engine weet niks van MVC af. Zijn enige taak is de URL te analyseren en de controle over te dragen aan de route handler. De route handler gaat op zoek naar een HTTP handler, of een implementatie van IHttpHandler. De default HttpHandler is de MvcHandler. Deze handler extraheert de controller informatie door de request te vergelijken met de template waarden in de routing tabel. De handler haalt de strings eruit en stuurt deze naar de controller factory die op zijn beurt de geschikte controller teruggeeft.

Asynchronous controllers

Een grote aanpassing in MVC 4 t.o.v. MVC 3 zijn asynchrone controllers. In MVC zijn deze nu standaard opgenomen terwijl in MVC 3 gebruik maakte van een AsyncController. 

Async controllers zijn handig voor niet CPU-gebonden requests. Bij het maken van Action methods moet bepaalt worden of deze async moeten zijn of niet. Dit hangt af of de actie network- of I/O gebonden is. Zo ja, dan zijn async controllers aan te raden, anders niet. Ook wordt async aangeraden als de gebruiker een langlopend proces moet kunnen beeindigen. Een andere goede reden om async in te zetten is als er data uit (meerdere) data sources moet worden gehaald (een database is i/o).

Async kan worden ingezet door gebruik te maken van van de 'Task' class. Om een action result async te maken, markeer dan de controller als async en maak van de result type 'Task'

Views

'ViewBag' is een wrapper om 'ViewDataDictionary'

Extending the view engines

Zowel de Web Forms en de Razor view engine erven van de 'BuildManagerViewEngine' class, welke erft van de 'VirtualPathProviderViewEngine' class.

Designing for scalability

Er zijn twee manieren van schaalbaarheid: horizontaal en verticaal.
Horizontale schaalbaarheid is het toevoegen van extra nodes (servers, fysiek of virtueel) aan het systeem. Deze maken op hun beurt weer gebruik van een load-balancer of een ander mechanisme die bepaalt welke server er aangesproken moet worden.
Bij horizontaal schalen moet rekening worden gehouden hoe sessies worden afgehandeld. Ook moet rekening gehouden worden met caching en waar bestanden moeten worden opgeslagen.

Verticaal schalen is het toevoegen van resources aan één systeem. Denk hierbij aan extra CPU's of extra geheugen.

Tot slot is scaling naar de cloud ook een optie.

Objective 1.2: Design a distributed application

Een distributed application is software die runt op twee of meer systemen.

Integrating web services

Met MVC 4 is de Web API geintroduceerd waarmee REST (Representational State Transfer) services kunnen worden gemaakt. Dit kan door gebruik te maken van de 'ApiController', welke geserialiseerde data teruggeeft aan de client. De ApiController maakt geen gebruik van views, maar bekijkt de HTML headers of er een 'Accept' property is meegegeven om te bepalen hoe de data terug moet worden gestuurd naar de client (XML of JSON).

Web Services (ASMX) is een oudere manier om web services uit te rollen via SOAP (Simple Object Access Protocol). Om hiervan in C# gebruik te maken moet er een WSDL (Web Services Description Language) aanwezig zijn. WSDL is een XML formaat die de service beschrijft.

Designing a hybrid application

Een hybrid application is een applicationdie wordt gehost op meerdere plekken: het ene gedeelte wordt bijv gehost op het netwerk van het bedrijf en het nndere gedeeld in bijv. Azure. 
Er zijn twee hybrid patterns. De eerste is client-centric en de andere system-centric.

Client-centric is het makkelijkst, maar ook het fragielst omdat een verandering in het client gedeelte ook een verandering teweeg brengt in het server gedeelte.
System-centric is een meer Service Oriented Approach (SOA). Ideaal heeft het een service bus zoals Windows AppFabric, welke service requests distribueert naar bijv een service in de cloud, on-premise of een andere source zoals bijv een partner of provider site.

Planning for session management in a distributed environment

Een sessie is opgeslagen op de server en is uniek voor een gebruiker. De browser moet een uniek id terugsturen, een SessionId. Deze kan worden teruggestuurd middels een cookie of de query string.

Sessions kunnen in MVC 4 op 2 manieren worden benanderd: gebruik de session om data in op te slaan en de andere benadering is om helemaal geen gebruik te maken van sessies.

Session management in a distributed environment is geompliceerd. De meest zekere manier om state te beheren in een distributed environment is door geen gebruik van sessies te maken en de data door te sturen middels de query string of hidden fields.

IIS kent drie modes van sessie management: InProc, StateServer(/OutProc) en SQLServer.
InProc is de standaard en betekent dat de session opgeslagen wordt in de local memory van de server.
Bij StateServer wordt de sessie op een aparte server opgeslagen
Bij SQLServer wordt de sessie opgeslagen in de database.

Planning web farms

Web farms zijn een groep van servers die de load delen van het afhandelen van een request.

Objective 1.3 Design and implement the Windows Azure role life cycle

UnderstandingWindows Azure and roles

Azure biedt zowe PaaS (Platform as a Service) en IaaS (Infrastructure as a Service).
PaaS: biedt een computer platform aan zoals een OS, database, web server.
IaaS: biedt virtual servers.
Er zijn drie verschillende oplossingen beschikbaar in Azure: Virtual Machines, Web Sites en Cloud Services. Een goede keus voor MVC zijn VM's omdat deze op de lokale ontwikkel-omgeving lijken en dat maakt testen en ontwikkelen makkelijk. Je hebt volledige controle over de omgeving.
Web Sites is voor het eenvoudige hosting. Er is geen overhead voor onderhoud.

Identifying startup tasks

Azure startup tasks worden gebruikte om acties uit te voeren voordat een role start. Er zijn 3 verschillende roles in Azure: Web, Worker en VM. Als je IIS wilt draaien moet je de Web role nemen. Gebruik de Worker role als middle-tier applications gehost moeten worden zonder IIS. Voor alles wat niet met de Web of Worker bewerkstelligt kan worden dient de VM role gebruikt te worden.

Met startup tasks kunnen COM componenten geregistreerd worden, componenten geinstalleerd worden of registry keys geset worden. Ook worden tasks gebruikt voor langdurige processen. Startup tasks zijn enkel beschikbaar voor Web en Worker roles.

AppCmd.exe is een command line tool in Azure waarmee IIS settings kunnen worden beheerd bij het opstarten van een task.

Identifying and implementing Start, Run en Stop events

Overeenkomsten tussen de OnStart methode en de startup task:
- Beide hebben dezelfde time-out;
- Beide worden opnieuw uitgevoerd als de role wordt gerycled;
- Beide kunnen worden vooruit gevonfigureerd worden;

Verschillen zijn:
- Een startup task draait in een andere thread;
- State kan bewaarde blijven tussen de OnStart methode en de Run methode omdat ze beide tot dezelfde AppDomain horen;
- Een startup task kan zowel als background als foreground task fungeren.

Startup flow van een task:

Azure zet een harde time-out van 5 minuten op taken die op een niet-user-initiated manier worden afgesloten. Als je dus code heb in de OnStop override method en deze code is na 5 minuten nog niet klaar, dan wordt de taak geforceerd afgesloten.

Objective 1.4: Configure state management

Choosing a state management mechanism

In MVC kan op de volgende manieren state worden opgeslagen/bijgehouden:
- Cache, een memory pool welke is opgeslagen op de server en wordt gedeeld met alle gebruikers;
- Session, welke wordt opgeslagen op de server en uniek is voor elke gebruiker;
- Cookies, welke worden opgeslagen bij de client en mee wordt gestuurd bij elk HTTP request;
- QueryString, wordt meegestuurd als onderdeel van de URL;
- Context.Items, welke onderdeel is van de HttpContext en alleen toegankelijk tijdens het request;
- Profile, welke opgeslagen wordt in de database en informatie bijhoudt over meerdere sessions.

De Cache is enkel beschikbaar voor de applicatie op dezelfde server in hetzelfde appdomain. In een web-farm moeten er dus kopieen worden gemaakt van deze Cache.

Door te erven van SessionStateStoreProviderBase kan je je eigen session provider implementeren.

Cookies horen bij een domein of subdomein. Met zorgvuldige inrichting kunnen zij dus gebruikt worden in een web farm. Via HttpContext.Requrst.Cookies kunnen cookies worden uitgelezen en met HttpContext.Response.Cookies kunnen cookies geset worden.

De query string is geen onderdeel van de route data en wordt dus genegeerd door de routing engine. Het is in MVC mogelijk om de query string te encrypten.

Context.Items is beschikbaar tijdens de afhandeling van  request. Het wordt vaak gebruikt om data toe te voegen aan de request zodat deze data ook te gebruiken is in andere HTTP modules. Een voorbeeld hiervan is authentication, wat wordt afgehandeld door een module.

Profile information wordt opgeslagen in de database o.b.v. username en kan worden opgevraagd door HttpContext.Profile["MyData"]. Profile is onderdeel van de Membership en Roles provider, wat ingesteld moet worden in de web.config. Profile kan dus enkel gebruikt worden i.c.m. de membership provider omdat het gebaseerd is op informatie die door de membership wordt bijgehouden.

Planning for scalability

Bij schaalbaarheid kan men overwegen om zonder sessies te werken. Voordeel is dan dat bij horizontaal opschalen de bijgeschaalde servers geen kennis hoeven te hebben van de sessies. De state zou dan opgeslagen kunnen worden bij de client: via local storage of cookies. Via de server zou dit kunnen middels een profile.

Using cookies or local storage to maintain state

Cookies zijn de voorganger van Web Storage. Cookies hebben een limiet van 4KB en worden bij elk request naar de server gestuurd en weer terug naar de client. Bij Web Storage wordt de data enkel bij de client gelaten en dus niet naar de server gestuurd.

HTML5 Web Storage

Web Storage kent 2 scopes: sessionStorage en localStorage.
sessionStorage: middels getters en setters kan data worden beheerd zolang de tab/window van de browser openblijft;
localStorage: de data in de storage blijft bewaard, ook als de browser wordt gesloten. Daarnaast is de data in elke tab/window beschikbaar.
Web Storage kent ook events. Voorbeeld: 

'window.AddEventListener('storage', displayStorageEvent, true);'

Dit event luisters naar zowel local- als sessionstorage en wordt getriggered als er een verandering optreedt in storage..

Applying configuration settings in the Web.config file

InProc sessions kunnen worden ingeschakeld in de web.config:

<system.web>
 <sessionState mode="InProc" cookieless="false" timeout="20"
 sqlConnectionString="data
 source=127.0.0.1;Trusted_Connection=yes"
 stateConnectionString="tcpip=127.0.0.1:42424"
 />
</system.web>

StateServer:

<system.web>
 <sessionState mode="StateServer"
 stateConnectionString="192.168.1.103:42424" />
</system.web>

Profile (als ook gebruik wordt gemaakt van Memership provider):

<profile defaultprovider="DefaultProfileProvider" inherit="MyApplication.Models.CustomProfile"/>

Deze instellingen kunnen ook in Machine.config gemaakt worden. Dit zorgt er voor dat de instellingen voor alle web sites geldt op de betreffende server.

Implementing sessionless state

Sessionless state is het onderhouden van data zonder deze op te slaan in een enige vorm van session (inproc, state server of profile).

Het ontwerp van session state in ASP.NET gaat er van uit dat er maar één request van een gebruiker tegelijkertijd plaats vindt. Dit betekent dat als een pagina meerdere onafhankelijke AJAX requests doet, dat de server deze requests verwerkt op een seriële manier, na elkaar dus. Als de applicatie geen gebruik maakt van sessies, dan kunnen AJAX requests parallel worden afgehandeld. Dit komt de performance natuurlijk ten goede.

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren