O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Net core base

228 visualizações

Publicada em

corto .Net Core

Publicada em: Tecnologia

Net core base

  1. 1. .NET Core ASP .NET Core Base
  2. 2. Pattern Richiesta-Risposta (1) ● Un server è una risorsa di elaborazione che riceve le richieste dai client e le serve. Un server, in genere, è una macchina di grande potenza con un'enorme memoria per elaborare molte richieste. ● Un client è una risorsa informatica che invia una richiesta e riceve la risposta. ● Un client può essere in genere qualsiasi applicazione che invia le richieste. ● Il modello richiesta-risposta, prevede che ad una richiesta di una risorsa ad un server, il server risponda con la risorsa richiesta. ● Una risorsa potrebbe essere qualsiasi cosa: una pagina web, un file di testo, un'immagine o un altro formato di dati.
  3. 3. ASP .NET Core Beniamino Ferrari 3 Pattern Richiesta-Risposta (2)
  4. 4. ASP .NET Core Beniamino Ferrari 4 La natura stateless dell’http (1) ● Quando il client richiede nuovamente la stessa risorsa, il server risponde di nuovo con la risorsa richiesta senza avere alcuna conoscenza del fatto che lo stesso è stato richiesto e servito in precedenza. ● Il protocollo HTTP intrinsecamente non ha alcuna conoscenza dello stato di nessuna delle precedenti richieste ricevute e pubblicate. ● Sono disponibili diversi meccanismi che mantengono lo stato, ma il protocollo HTTP non mantiene lo stato da solo.
  5. 5. ASP .NET Core Beniamino Ferrari 5 RPC vs Rest ● Remote Procedure Call (RPC): le chiamate RPC usano SOAP (Simple Object Access Protocol), che è un protocollo basato su XML che è viaggia attraverso HTTP. RPC era usato negli anni precedenti al 2008. ● REST: REST che sta per Representational State Transfer. Si utilizzano URLs per rappresentare delle risorse. Es. https://myapi.example.com/books/ che rappresenta un identificativo di un insieme di libri. Potremmo con l’URL https://myapi.example.com/books/1 potrebbe essere l’indentificativo con ID 1
  6. 6. ASP .NET Core Beniamino Ferrari 6 REST ● Quando interagiamo con queste risorse HTTP utilizziamo un verbo ● I verbi HTTP e metodi HTTP sono sinonimi ● I metodi disponibili in HTTP sono GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT, and PATCH ● Quando facciamo una richiesta HTTP con con metodo GET, stiamo facendo una richiesta a un web server di ottenere una risorsa con una determinata rappresentazione. ● Il server potrebbe restituire una risorsa rappresentata in XML per una richiesta e un JSON per un’altra richiesta, questo dipende dal cliente che specifica tramite un chiave accept posta nel header
  7. 7. ASP .NET Core Beniamino Ferrari 7 Metodi HTTP ● HTTP definisce metodi (a volte anche nominati verbi) per indicare l’azione desiderata su una determinata risorsa ● I metodi disponibili in HTTP sono GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT e PATCH. Nella maggior parte delle applicazioni Web, i metodi GET e POST sono maggiormente utilizzati
  8. 8. ASP .NET Core Beniamino Ferrari 8 Metodo GET HTTP (1) ● Il metodo GET viene utilizzato per recuperare una risorsa dal server ● Il metodo GET dovrebbe essere utilizzato solamente per recuperare le risorse e non deve essere usato per modificare o aggiungere risorse ● Nel metodo GET posso essere aggiunti dei parametri che vengono accodati alla URL e sono perciò visibili all’utente ● Il vantaggio di questo approccio è che l'utente può aggiungere un segnalibro all'URL e visitare nuovamente la pagina ogni volta che lo desidera. Un esempio è https://yourwebsite.com/?tech=api&db=sql. ● In quest’ultimo esempio sono presenti un paio di parametri tech che prende il valore api e il parametro db che prende il valore sql
  9. 9. ASP .NET Core Beniamino Ferrari 9 Metodo GET HTTP (2) ● Lo svantaggio del metodo GET è che, dato che i dati sono passati in chiaro nell'URL come parametri, non possono essere utilizzati per inviare informazioni sensibili. ● Inoltre, la maggior parte dei browser ha limitazioni sul numero di caratteri
  10. 10. ASP .NET Core Beniamino Ferrari 10 Metodo POST (1) ● Il metodo POST viene utilizzato generalmente per creare o aggiornare risorse di un server ● Il POST può essere usato per inviare informazioni che devono essere processate ● I dati vengono passati nel body della richiesta ● Sarà possibile inviare informazioni relativamente sensibili al server, poiché i dati sono incorporati nel body della richiesta e non saranno visibili all'utente finale nell'URL. ● Tuttavia, va tenuto in considerazione che i tuoi dati non sono mai veramente sicuri se non utilizzi HTTPS ● Solamente se si usa HTTPS siamo protetti del fatto che per un ipotetico man in the middle possa leggere i dati che vengono inviati
  11. 11. ASP .NET Core Beniamino Ferrari 11 Metodo POST (2) ● Inoltre, dato il fatto che i dati non vengono posti nella URL, non siamo soggetti a particolari limitazioni di grandezza dei dati
  12. 12. ASP .NET Core Beniamino Ferrari 12 I 3 aspetti dei verbi HTTP ● Idempotenza: è un concetto importante nelle chiamate HTTP. Nelle richieste idempotentii, è possibile modificare lo stato lato server solo una volta. Se vengono eseguite multiple richieste idempotenti al server, l'effetto sarà come se ne avessi fatto una una sola richiesta ● Sicurezza: le richieste sicure semplicemente non causano alcun side effect. Vengono utilizzate solo per recuperare i dati. Per side effect, facciamo riferimento a eventuali modifiche persistenti nella memoria o nel database o in qualsiasi altro sistema esterno. Registrare un utente o trasferire del denaro sono provocano side effect, ma mostrare delle informazioni non provoca side effect ● Cacheability: Server o client o proxy posso memorizzare in una cache le risposte alle richieste
  13. 13. ASP .NET Core Beniamino Ferrari 13 I metodi HTTP più importanti Metodo Descrizione Idempotente Sicuro Cache GET Legge una risorsa si si si POST Crea una risorsa o lancia una processo no no no PUT Sovrascrive una risorsa esistente yes no no PATCH Modifica una parte di una risorsa no no no DELETE Elimina una risorsa yes no no
  14. 14. ASP .NET Core Beniamino Ferrari 14 PATH vs PUT ● se viene effettuata una richiesta PATCH a un URL inesistente, ad esempio tentando di sostituire la porta principale di un edificio inesistente, dovrebbe semplicemente fallire senza creare una nuova risorsa diversamente la PUT, che creerebbe una nuova utilizzando il payload
  15. 15. ASP .NET Core Beniamino Ferrari 15 Altri Metodi ● CONNECT: viene utilizzato per il tunneling HTTP per motivi di sicurezza. Non è comune nelle tipiche applicazioni e servizi web ● TRACE: viene utilizzato per scopi di debug. Non è comune nelle tipiche applicazioni e servizi web ● OPTION: utilizzando il verbo OPTIONS, permette di chiedere al server quali metodi http sono supportati dal server web una determiatas risorsa
  16. 16. ASP .NET Core Beniamino Ferrari 16 Introduzione ● ASP.NET Core è una nuova progettazione significativa di ASP.NET. ● ASP.NET Core è open source e multi-piattaforma utilizzabile per la creazione di moderne applicazioni connesse a Internet basate su cloud, come App Web e Web API. ● È stato progettato per fornire un framework di sviluppo ottimizzato per le app distribuite nel cloud (es. Azure) oppure on-premise (in locale). ● E’ possibile sviluppare ed eseguire le tue app ASP.NET Core su Windows, Mac e Linux.
  17. 17. ASP .NET Core Beniamino Ferrari 17 Vantaggi di ASP .NET Core ● ASP.NET Core possiede un gran numero di modifiche architetturali che si traducono in una struttura molto più snella e modulare rispetto a ASP .NET. ● ASP.NET Core non è più basato su System.Web.dll. Si basa su un insieme di pacchetti NuGet granulari e ben gestiti. Ciò ti consente di ottimizzare la tua app per includere solo i pacchetti NuGet di cui hai bisogno. ● Questo permette di sviluppare un’app più piccola con una maggiore sicurezza, ridotta manutenzione, prestazioni migliori e costi ridotti (modello pay-for-what-you-use).
  18. 18. ASP .NET Core Beniamino Ferrari 18 Anatomia di un’applicazione (1) Un'app di ASP.NET Core è un'app di console che crea un server Web nel suo metodo Program.Main. Il metodo Main è il punto di ingresso gestito dell'app: public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }
  19. 19. ASP .NET Core Beniamino Ferrari 19 Anatomia di un’applicazione (2) ● Nel metodo Main viene chiamato WebHost.CreateDefaultBuilder, che segue il modello del builder per creare un host web. ● Il builder ha metodi che definiscono un server Web (ad esempio, UseKestrel) e la classe di avvio (UseStartup). ● Nell'esempio precedente, viene usato il server web Kestrel
  20. 20. ASP .NET Core Beniamino Ferrari 20 Anatomia di un’applicazione (3) ● Il metodo useStartUp definisce la classe di StartUp della nostra applicazione ● La classe Startup è dove sono configurati tutti i servizi richiesti dall'app e dove viene definita la pipeline di gestione richieste. ● La classe di avvio deve essere pubblica e di solito contiene i seguenti metodi. Startup.ConfigureServices è facoltativo.
  21. 21. ASP .NET Core Beniamino Ferrari 21 StartUp public class Startup { // Qui vengono inseriti i servizi che vengono usati nell’app public void ConfigureServices(IServiceCollection services) { } // Questo metodo va utilizzato per configurare la pipeline http public void Configure(IApplicationBuilder app) { } }
  22. 22. ASP .NET Core Beniamino Ferrari 22 Servizi ● Un servizio è un componente destinato al consumo comune in un'app. I servizi sono resi disponibili tramite Dipendency Injection (DI). ● ASP.NET Core include un contenitore Inversion of Control nativo (IoC) che supporta l'iniezione del costruttore per impostazione predefinita.
  23. 23. ASP .NET Core Beniamino Ferrari 23 Dipendency injection (1) ● Dependency Injection (DI) è un modello che aiuta gli sviluppatori ad astrarre diverse parte delle loro applicazioni. ● Fornisce un meccanismo per la costruzione di grafi di dipendenza che non dipendono dalle definizioni delle classi coinvolte.
  24. 24. ASP .NET Core Beniamino Ferrari 24 Dipendency Injection (2) class Bar : IBar { // ... } class Foo { private readonly IBar _bar; public Foo(IBar bar) { _bar = bar; } }
  25. 25. ASP .NET Core Beniamino Ferrari 25 Dipendency Injection (3) ● In questo esempio, Foo dipende da IBar e da qualche parte dovremo costruire un'istanza di Foo e specificare che dipende dalla barra di implementazione in questo modo: IBar bar = new Bar(); var foo = new Foo(bar);
  26. 26. ASP .NET Core Beniamino Ferrari 26 Dependency Injection(4) ● I framework DI forniscono un meccanismo, spesso definito contenitore di Inversion of Control (IoC), per gestire l'implementazione e l'injection ● Per fare ciò, è sufficiente registrare i servizi con un contenitore e inserirli. //Inserimento nel container del servizio container.Register<Bar>().As<IBar>(); container.Register<Foo>(); //Recupero del servizio var foo = container.Get<Foo>();
  27. 27. ASP .NET Core Beniamino Ferrari 27 Dependency Injection in ASP.Net Core (1) ● in ASP.Net Core. Puoi è possibile configurare il contenitore dei servizi nel metodo Startup.ConfigureServices: public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddTransient<IArticleService, ArticleService>(); } // ... }
  28. 28. ASP .NET Core Beniamino Ferrari 28 Dependency Injection in ASP.Net Core (2) ● Quando una richiesta viene instradata al controller, verrà risolta la DI, come definita nel metodo StarttUp.ConfigureServices public class ArticlesController : Controller { private readonly IArticleService _articleService; public ArticlesController(IArticleService articleService) { _articleService = articleService; } [HttpGet("{id}"] public async Task<IActionResult> GetAsync(int id) { var article = await _articleService.GetAsync(id); if(article == null) return NotFound(); return Ok(article); } }
  29. 29. ASP .NET Core Beniamino Ferrari 29 Dependency Lifetimes ● Al momento della registrazione, le dipendenze richiedono una definizione della lifetime. ● La durata del servizio definisce le condizioni in base alle quali verrà creata una nuova istanza di servizio.
  30. 30. ASP .NET Core Beniamino Ferrari 30 Dependency Lifetimes ● Transient – L’istanza del servizio vene creata ogni volta che viene richiesto ● Scoped: creato una volta all’interno di uno scope. La maggior parte delle volte, scope si riferisce all’interno di un controller (per una specifica richiesta web). Ma questo può anche essere usato per qualsiasi blocco di codice ● Singleton – la creazione dell’istanza del servizio desiderato avviene solo la prima volta e successivamente ogni richiesta di tale servizio verrà restituita sempre la stessa instanza
  31. 31. ASP .NET Core Beniamino Ferrari 31 Interface and Implementation public interface ILogger { void WriteLog(string message); } public class Logger : ILogger { public WriteLog() { using (StreamWriter writer = System.IO.File.AppendText("logfile.txt")) { writer.WriteLine(“new instance”+ new Random().next(1,10)); } } void WriteLog(string message) { using (StreamWriter writer = System.IO.File.AppendText("logfile.txt")) { writer.WriteLine(message); } } }
  32. 32. ASP .NET Core Beniamino Ferrari 32 Class use DI public class AClass { private readonly ILogger _logger; public AClass(ILogger logger) { _logger = logger; } }
  33. 33. ASP .NET Core Beniamino Ferrari 33 Transient public void ConfigureServices(IServiceCollection services) { services.AddTransient(ILogger,Logger); } public class MyController : ControllerBase { private readonly ILogger _logger; public MyController(Logger logger) { _logger = logger; _logger.WriteLog(“Arrivata una richiesta”); new AClass(); // genera un’altra istanza di Logger } }
  34. 34. ASP .NET Core Beniamino Ferrari 34 Singleton public void ConfigureServices(IServiceCollection services) { services.AddSingleton(ILogger,Logger); } public class MyController : ControllerBase { private readonly ILogger _logger; public MyConteroller (Logger logger) { _logger = logger; _logger.WriteLog(“Arrivata una richiesta”); new AClass(); // non genera un’altra istanza di Logger } }
  35. 35. ASP .NET Core Beniamino Ferrari 35 Scoped public void ConfigureServices(IServiceCollection services) { services.AddScoped(ILogger,Logger); } public class MyController : ControllerBase { private readonly ILogger _logger; public MyConteroller logger) { _logger = logger; _logger.WriteLog(“Arrivata una richiesta”); new AClass(); // genera un’altra istanza di Logger } }
  36. 36. ASP .NET Core Beniamino Ferrari 36 Web Api Model CRUD Mongo DB API Descrizione Richiesta nel body Risposta nel body GET /api/books Restituisce tutti i libri nessuna Array di oggetti libro GET /api/books/{id} Restituisce un elemento libro attraverso il suo id nessuna Un elemento, il libro identificato dal suo id POST /api/books Aggiunge un nuovo elemento libro alla collection I’oggetto libro da aggiungerel’oggetto aggiunto PUT /api/books/{id} Aggiorna un elemento esistente nella collection l’oggetto libro da modificare nessuna DELETE /api/books/{id} Elimina un elemento esistente nessuna nessuna
  37. 37. ASP .NET Core Beniamino Ferrari 37 HTTP Request HTTP Response Read/Write Model Read/Write {title: “zorro”} Serialize
  38. 38. ASP .NET Core Beniamino Ferrari 38 1.1 - Esempio Web Api - Model public class Book { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } [BsonElement("title")] public string title { get; set; } [BsonElement("price")] public decimal price { get; set; } }
  39. 39. ASP .NET Core Beniamino Ferrari 39 1.2 - Esempio Web Api - Model ● La classe model sarà una classe usata come mero contentiore di dati ed ogni suo property verrà mappata ad una chiave del documento memorizzato a db ● Le decoration apposte – [BsonId] va ad indicare quella property conterrà il campo _id di Mongo – [BsonRepresentation(BsonType.ObjectId)] va a dire che quell’elemento dovrà essere nella forma dell’objetid di mongo, un ObjectId è un tipo composto da 12 byte – [BsonElement("key_name")] va dire che la property è abbinata alla chiave posta tra le parentesi
  40. 40. ASP .NET Core Beniamino Ferrari 40 2.1- Esempio Web Api - Service public class BookService { private readonly IMongoCollection<Book> _books; public BookService(IConfiguration config) { var client = new MongoClient(config.GetConnectionString("BookstoreDb")); var database = client.GetDatabase("TEST_DB"); _books = database.GetCollection<Book>("Books"); } public List<Book> Get() { return _books.Find(book => true).ToList(); } public Book Get(string id) { return _books.Find<Book>(book => book.Id == id).FirstOrDefault(); } ..
  41. 41. ASP .NET Core Beniamino Ferrari 41 2.2- Esempio Web Api - Service ….. public Book Create(Book book) { _books.InsertOne(book); return book; } public void Update(string id, Book bookIn) { _books.ReplaceOne(book => book.Id == id, bookIn); } public void Remove(Book bookIn) { _books.DeleteOne(book => book.Id == bookIn.Id); } public void Remove(string id) { _books.DeleteOne(book => book.Id == id); } }
  42. 42. ASP .NET Core Beniamino Ferrari 42 3.1 - Esempio Web Api - Controller [Route("api/[controller]")] [ApiController] public class BooksController : ControllerBase { private readonly BookService _bookService; public BooksController(BookService bookService) { _bookService = bookService; } [HttpGet] public ActionResult<List<Book>> Get() { return _bookService.Get(); } ...
  43. 43. ASP .NET Core Beniamino Ferrari 43 3.2 - Esempio Web Api - Controller ● [Route("api/[controller]")] è un decoratore che dice che per raggiungere il controller andrà apposto al’host name “/api/nomecontroller” ● [ApiController] agisce sugli oggetti di ritorno ed esegue la serializzazione automatica degli oggetti restituiti dalle action del controller ● [HttpGet("{id:length(24)}")] va dire che il parametro in ingresso id deve essere una stringa di 24 caratteri ● [FromBody] è decoratore utilizzato sui parametri in ingresso che va a dire nel nostro caso che il parametro deve essere deserializzato dal contenuto del body della richiesta http
  44. 44. ASP .NET Core Beniamino Ferrari 44 3.3 - Esempio Web Api - Controller [HttpGet("{id:length(24)}", Name = "GetBook")] public ActionResult<Book> Get(string id) { var book = _bookService.Get(id); if (book == null) { return NotFound(); } return book; } [HttpPost] public ActionResult<Book> Post([FromBody]Book book) { _bookService.Create(book); return CreatedAtRoute("GetBook", new { id = book.Id.ToString() }, book); }
  45. 45. ASP .NET Core Beniamino Ferrari 45 3.4 - Esempio Web Api - Controller [HttpPut("{id:length(24)}")] public IActionResult Put(string id, [FromBody]Book bookIn) { var book = _bookService.Get(id); if (book == null) { return NotFound(); } _bookService.Update(id, bookIn); return NoContent(); } [HttpDelete("{id:length(24)}")] public IActionResult Delete(string id) { var book = _bookService.Get(id); if (book == null) { return NotFound(); } _bookService.Remove(book.Id); return NoContent(); }

×