4. History of ASP (20 years)
⢠1996 - Active Server Pages (ASP)
⢠2002 â ASP.NET
⢠2005 â ASP.NET 2
⢠2008 â ASP.NET MVC
⢠2012 â ASP.NET Web API
⢠2014 â ASP.NET vNext
â 2015 â ASP.NET 5 RC1
â 2016 â ASP.NET Core 1.0 (June 27th, 2016)
5. Problems with ASP.NET Architecture
⢠Limited hosting possibilities (IIS only)
⢠Dependency on IIS environment (System.Web)
⢠Web evolves faster than the .NET Framework
⢠Requires full-blown .NET Framework
⢠Resource intensive and not web-friendly
⢠Hard to optimize for lightweight high-performance apps
⢠Not completely cloud-optimized
6. Introducing ASP.NET Core 1.0
(Tools in Preview 2)
OS
.NET CLR
ASP.NET
MVC
(UI + API)
Host
Self-HostedIIS
.NET Core CLR
Middleware
7. What is Tooling?
⢠Everything that is part of the framework
⢠Command line tools
â dotnet CLI
⢠Project tools
â ASP.NET templates
â xproj / csproj
⢠Visual Studio tools
â Configuration IntelliSense
â Debugger support
8. Two Runtimes
⢠.NET Full Framework (4.6)
â Not going awayâŚ
â Windows hosting with full .NET APIs
⢠.NET Core 1.0
â Subset of the full framework
⢠No Windows Forms, WPF, Silverlight
⢠No System.Web (WebForms)
â Implemented as set of NuGet packages
â Cross-platform and Nano server support
10. ASP.NET Core Features
⢠Flexible and cross-platform runtime
⢠Modular HTTP request pipeline
⢠Unifying MVC, Web API, and Web Pages
⢠Side-by-side versioning with .NET Core
⢠Built-in Dependency Injection
⢠Self-host and IIS-hosted (sort ofâŚ)
⢠Open source on GitHub
12. Solution and Projects
⢠global.json
Project references (in addition to the .sln)
⢠wwwroot
Root for static content (html, css, js, images, etcâŚ)
⢠Program.cs
ASP.NET hosting libraries. This is where it all starts
⢠project.json
References, compiler settings, tooling (replaces web.config and
packages.config)
⢠Startup.cs
DI and pipeline configuration
(replaces global.asax and configuration code)
14. ASP.NET Core Middlewares
⢠Improved HTTP performance
â New lean and fast HTTP request pipeline
â You choose what to use in your application
â By registering middlewares
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
{
app.UseExceptionHandler("/Home/Error");
app.UseStaticFiles();
app.UseIdentity();
app.UseMvc(routes => ...)
}
15. Whereâs the AppSettings?
⢠Not relying on web.config anymore
⢠New configuration system based on key/value pairs:
â JSON files
â INI files
â XML files
â Environment variables
⢠Configuration can come from multiple resources
â Last resource wins
17. Dependency Injection
⢠ASP.NET Core is DI-friendly
⢠Basic DI container available throughout the stack
⢠BYOC is also supported (already implemented for Autofac, Dryloc,
StructureMap, etc.)
⢠Out-of-the-box container supports:
â Singleton / Instance â single instance
â Transient â new instance each time
â Scoped â new instance per request (HTTP context)
⢠https://github.com/aspnet/DependencyInjection
18. DI with Controllers
public class ProductsController : Controller
{
private readonly IProductsRepository _repository;
public ProductsController(IProductsRepository repository)
{
this._repository = repository;
}
public IActionResult Index()
{
var products = _repository.GetAllProducts();
return View(products);
}
}
services.AddTransient<IProductsRepository, DefaultProductsRepository>();
19. Logging
⢠ASP.NET Core has built-in support for logging
⢠Uses the built-in DI to get a logger instance
⢠Standard logger outputs: category, log level, event Id, and message
⢠Built-in loggers for:
â Console (hosting from cmd/terminal)
â TraceSource (good old System.Diagnostics)
â Debug (Visual Studio output window)
⢠Custom loggers are also available (log4net, serilog, elmah, etc.)
⢠https://github.com/aspnet/Logging
20. Logging with Controllers
public class TodoController : Controller
{
private readonly ITodoRepository _todoRepository;
private readonly ILogger<TodoController> _logger;
private const int LIST_ITEMS = 1001;
public TodoController(ITodoRepository todoRepo, ILogger<TodoController> logger)
{
_todoRepository = todoRepo;
_logger = logger;
}
[HttpGet]
public IEnumerable<TodoItem> GetAll()
{
_logger.LogInformation(LIST_ITEMS, "Listing all items");
EnsureItems();
return _todoRepository.GetAll();
}
}
21. The dotnet CLI
⢠Cross-platform command line toolchain
⢠Written in .NET Core
⢠External commands
⢠https://github.com/dotnet/cli
dotnet new
dotnet restore
dotnet build --output /stuff
dotnet /stuff/new.dll
dotnet publish
dotnet ef
dotnet razor-tooling
Dotnet aspnet-codegenerator
22. Hosting ASP.NET Core
⢠ASP.NET Core 1.0 is a stand-alone application
â Uses Kestrel HTTP server (based on libuv, as with node.js)
⢠Self-hosting with .NET Core
â Compiled into a .dll file, hosted by the dotnet CLI
⢠Self-hosting with .NET 4.6
â Compiles into an .exe file
â Kestrel or the WebListener server (Windows HTTP.sys)
⢠IIS-hosted (.NET Core / .NET 4.6)
â IIS uses the ASP.NET Core Module to start the self-hosted app
â ASP.NET Core template generates the required web.config
â Starts either dotnet webapp1.dll or webapp.exe
⢠https://docs.asp.net/en/latest/hosting/aspnet-core-module.html
27. ASP.NET Core MVC
⢠No more duplication - one set of concepts
⢠Used for creating both UI and API
⢠Based on the new ASP.NET Core pipeline
⢠Supports .NET Core
⢠Built DI first
⢠Runs on IIS or self-host
⢠New features in controllers and views
28. Getting Started with MVC
⢠Project.json
⢠Startup.cs
"dependencies": {
"Microsoft.AspNet.Server.Kestrel": "1.0.0",
// Add this:
"Microsoft.AspNet.Mvc": "1.0.0"
}
// Register MVC default services for DI
services.AddMvc();
app.UseMvc(routes => {
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
30. Controllers â Two in One
⢠UI â same as with MVC 5
⢠API â similar, but different
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
[Route("api/[controller]")]
public class ProductsController : Controller
{
[HttpGet("{id:int}")]
public Product GetProduct(int id)
{
return new Product() { ID = id };
}
}
31. Actions â IActionResult
[HttpGet("{id:int}", Name = "GetByIdRoute")]
public IActionResult GetById (int id)
{
var item = _items.FirstOrDefault(x => x.Id == id);
if (item == null) { return NotFound(); }
return new ObjectResult(item);
}
[HttpPost]
public IActionResult CreateTodoItem([FromBody] TodoItem item)
{
_items.Add(item);
return CreatedAtRoute(
"GetByIdRoute", new { id = item.Id }, item);
}
32. Showing Some UI for Your API
⢠Swagger - a JSON-based service description framework
⢠Create a Swagger endpoint using Swashbuckle.SwaggerGen
â Browse to /swagger/v1/swagger.json
⢠Host a built-in UI for testing APIs with Swashbuckle.SwaggerUi
â Browse to /swagger/ui
"dependencies": {
"Swashbuckle.SwaggerGen": "6.0.0-beta901",
"Swashbuckle.SwaggerUi": "6.0.0-beta901"
}
services.AddSwaggerGen();
app.UseSwagger();
app.UseSwaggerUi();
34. Injecting Services to Views
⢠Preferable than using static classes/methods
⢠Use interfaces instead of concrete types
⢠Register in IoC using different lifecycles
public class CatalogService : ICatalogService
{
public async Task<int> GetTotalProducts() {...} // From ICatalogService
}
@inject MyApp.Services.ICatalogService Catalog
<html>
<body>
<h3>Number of products in the catalog</h3>
@await Catalog.GetTotalProducts()
</body>
</html>
services.AddTransient<ICatalogService, CatalogService>();
35. Flushing Content with Razor
⢠In ASP.NET <= 5, browser had to wait until Razor
rendered the entire page
⢠Razor now supports flushing, causing HTML to get
chunked (streamed)
â @await FlushAsync()
⢠Not supported when rendering layout sections
36. Last, but not Least, Tag Helpers
⢠Tag helpers are an alternative to HTML helpers
⢠Tag helpers look like regular HTML elements
⢠Instead of doing this:
⢠Do this:
⢠Itâs the return of Web Controls, NOOOOOO!!!
@Html.ActionLink("Click me", "AnotherAction")
<a asp-action="AnotherAction">Click me</a>
37. Tag Helpers are not Evil
⢠Tag Helpers generate markup within their enclosing tag
⢠Less Razor/HTML mess in the .cshtml file
⢠Data-attributes style approach
⢠Use C# to better construct the markup
â Add/remove parts from the inner content
â Generate complex HTML (recursive, nested, âŚ)
â Cache the output
38. Existing Tag Helpers
⢠HTML elements
â <a>, <form>, <input>, <label>, <link>, <script>, <select>, <textarea>
⢠Logical
â <cache>
⢠Placeholders
â ValidationSummary (<div>), ValidationMessage (<span>)
⢠You can create your own Tag Helpers
⢠Check out the source for reference
https://github.com/aspnet/Mvc/tree/dev/src/Microsoft.AspNetCore.Mvc.TagHelpers
39. Key Improvements in ASP.NET Core
⢠Totally modular - Everything is a package
⢠Lightweight - you use minimum set of modules
⢠Faster startup, lower memory footprint
⢠Can be deployed side-by-side with .NET Core
⢠Cross platform - can be hosted anywhere
⢠Better developer experience â DI and one MVC
⢠Everything is open-sourced
41. Get Started with ASP.NET Core
⢠Install Visual Studio 2015 / Visual Studio Code
⢠Walkthroughs and samples at http://www.asp.net/core
⢠Documentation at http://docs.asp.net/en/latest
⢠Get the code from http://github.com/aspnet
⢠Read blogs at http://blogs.msdn.com/b/webdev
⢠@IdoFlatow // idof@sela.co.il // http://www.idoflatow.net/downloads