Skip to content

OsvaldoJ/practical-aspnetcore

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

69 samples for aspnetcore fundamentals (updated daily)

Welcome

The goal of this project is to enable .NET programmers to learn the new ASP.NET Core stack from the ground up directly from code. I will not address ASP.NET Core MVC in this project. There is so much power in the underlying ASP.NET Core stack. Don't miss them!

You will need to download the latest release version .NET Core SDK to be able to run these samples.

If you are running these samples on Linux, change the target framework inside the csproj files from

<TargetFramework>net461</TargetFramework>

to

<TargetFramework>netcoreapp1.1</TargetFramework>

Every sample is designed specifically to demonstrate a single idea. We will go wide and deep to the nitty gritty of ASP.NET Core stack. Enjoy the ride!

Some of the samples you see here involve mixed projects (net451) that will run only in Windows. For many .NET developers, full framework is the reality for forseeable future. We are not going to port multi-year production systems to run on Linux. We want to improve the creaky .NET MVC 2.0 that we have lying around and bring it up to speed to aspnetcore MVC.

All these projects require the following dependencies

   "Microsoft.AspNetCore.Hosting" : "1.1.0-*"

This dependency pulls its own dependencies which you can check at project.lock.json. This allows us to not explicitly specify some dependencies ourselves.

If a sample require additional dependencies, I will list them.

I highly recommend using Visual Studio Code to play around with these samples but it is not required. You can use Visual Studio 2017 as well.

To run these samples, simply open your command line console, go to each folder and execute dotnet restore and then continue with dotnet watch run.

  • Hello World (14)

    • Hello World with reload

      Setup your most basic web app and enable the change+refresh development experience.

      We are using IApplicationBuilder Run, an extension method for adding terminal middleware.

    • Hello World with startup basic

      This project contains all the available services available in Startup class constructor, ConfigureServices and Configure methods.

    • Hello World with multiple startups

      This project highlights the fact that you can create multiple Startup classes and choose them at start depending on your needs.

    • Hello World with Connection info

      Enumerate the connection information of a HTTP request.

    • Environmental settings

      Set your application environment to Development or Production or other mode directly from code.

    • Console logging

      Setup a basic logging in your app and show it to console.

      We add the following dependencies "Microsoft.Extensions.Logging": "1.1.0" and "Microsoft.Extensions.Logging.Console": "1.1.0"

      We are using IApplicationBuilder Run, an extension method for adding terminal middleware.

    • Console logging - without framework log messages

      Filter out frameworking logging from your log output. Without filtering, logging can get very annoying becuase the framework produces a lot of messages.

    • Hello World with middlewares

      ASPNetCore is built on top of pipelines of functions called middleware.

      We are using IApplicationBuilder Use, an extension method for adding middleware and IApplicationBuilder Run.

    • IApplicationLifetime

      Respond to application startup and shutdown.

      We are using IApplicationLifetime that trigger events during application startup and shutdown.

    • IHostingEnvironment

      IHostingEnvironment is available at Startup constuctor and Startup.Configure. This sample shows all the properties available in this interface.

    • Application Environment

      Requires Microsoft.Extensions.PlatformAbstractions" : "1.1.0-* dependency. This sample shows how to obtain application environment information (target framework, etc).

    • Cookies

      Simply read and write cookies.

    • Removing cookies

      Simply demonstrate on how to remove cookies.

    • Adding HTTP Response Header

      Demonstrate on how to add a response header and where is allowed place to do it.

  • Form (2)

    We take dependency on "Microsoft.AspNetCore.Routing" : "1.1.0-*" to enable routing facilities to make the form handling easier.

    • Form Values

      Handles the values submitted via a form.

    • Form Upload File

      Upload a single file and save it to the current directory (check out the usage of .UseContentRoot(Directory.GetCurrentDirectory()))

  • Routing (9)

    We take dependency on "Microsoft.AspNetCore.Routing" : "1.1.0-*" to enable routing facilities in your aspnetcore apps. There are several samples to illuminate this powerful library.

    • Router

      A single route handler that handles every path request.

    • Router 2

      Two route handler, one for home page (/) and the other takes the rest of the request using asterisk (*) in the url template.

    • Router 3

      We are exploring default handler - this is the entry point to create your own framework.

    • Router 4

      We are mixing optional route parameter, route parameter with default value and default handler.

    • [Router 5]

      This is still broken. I am trying to figure out how to do nested routing. Wish me luck!

    • Router 6

      We are building a template route segment by segment and parts by parts, oldskool. We are using TemplateMatcher, TemplateSegment and TemplatePart.

      Hold your mask, we are going deep.

    • Router 7

      We are creating a routing template with two segments, one with Literal part and the other Parameter part, e.g, "/page/{*title}"

    • Router 8

      We are creating a routing template with one segment consisted of two parts, one Literal and one Parameter, e.g. "/page{*title}". Note the difference between this example and Router 7.

    • Router 9

      I am still trying to determine whether TemplateMatcher uses the InlineConstraint information.

      Update: No, TemplateMatcher does not run constraints. #362

    • Router 10

      We have been building a RouteTemplate manually using TemplateSegment and TemplatePart. In this example we are using TemplateParser to build the RouteTemplate using string.

  • Middleware (7)

    We will explore all aspect of middleware building in this section. There is no extra dependency taken other than Kestrel and dotnet watch.

    • Middleware 1

      This example shows how to pass information from one middleware to another using HttpContext.Items.

    • Middleware 3

      This is the simplest middleware class you can create.

    • Middleware 4

      Use app.Map (MapMiddleware) to configure your middleware pipeline to respond only on specific url path.

    • Middleware 5

      Nested app.Map (show Request.Path and Request.PathBase).

    • Middleware 6

      Use app.MapWhen(MapWhenMiddleware) and Nested app.Map (show Request.Path and Request.PathBase).

    • Middleware 7

      Use MapMiddleware and MapWhenMiddleware directly without using extensions (show Request.Path and Request.PathBase).

    • Middleware 8

      Demonstrate the various ways you can inject dependency to your middleware class. It's so cool.

  • Features (7)

    Features are collection of objects you can obtain from the framework at runtime that serve different purposes.

    • Server Addresses Feature

      Use this Feature to obtain a list of urls that your app is responding to.

    • Request Feature

      Obtain details of a current request. It has some similarity to HttpContext.Request. They are not equal. HttpContext.Request has more properties.

    • Connection Feature

      Use IHttpConnectionFeature interface to obtain local ip/port and remote ip/port.

    • Custom Feature

      Create your own custom Feature and pass it along from a middleware.

    • Custom Feature - Override

      Shows how you can replace an implementation of a Feature with another within the request pipeline.

    • Request Culture Feature

      Use this feature to detect the culture of a web request through IRequestCultureFeature. It needs the following dependency "Microsoft.AspNetCore.Localization": "1.1.0".

    • Session Feature

      Use session within your middlewares. This sample shows a basic usage of in memory session. It needs the following dependency '"Microsoft.AspNetCore.Session" : "1.1.0-"and"Microsoft.Extensions.Caching.Memory" : "1.1.0-"`.

  • Dependency Injection (2)

    ASP.NET Corenetcore lives and die by DI. It relies on Microsoft.Extensions.DependencyInjection library. There is no need to put this dependency in your project.json explicitly because aspnetcore already has this package as its own dependency.

    • Dependency Injection 1 - The basic

      Demonstrate the three lifetime registrations for the out of the box DI functionality: singleton (one and only forever), scoped (one in every request) and transient (new everytime).

    • Dependency Injection 3 - Easy registration

      Register all objects configured by classes that implements a specific interface (IBootstrap in this example). This is useful when you have large amount of classes in your project that needs registration. You can register them near where they are (usually in the same folder) instead of registering them somewhere in a giant registration function.

      Note: example 2 is forthcoming. The inspiration has not arrived yet.

  • File Provider (2)

    We will deal with various types of file providers supported by ASP.NET Core

  • In Memory Caching (a.k.a local cache) (4)

    These samples depends on Microsoft.Extensions.Caching.Memory library. Please add this dependency to your project.json.

    • Caching - Absolute/Sliding expiration

      This is the most basic caching you can use either by setting absolute or sliding expiration for your cache. Absolute expiration will remove your cache at a certain point in the future. Sliding expiration will remove your cache after period of inactivity.

    • Caching 2 - File dependency

      Add file dependency to your caching so when the file changes, your cache expires.

      You need to put the cache file in your project.json so it gets copied over, e.g.

      "buildOptions": { "emitEntryPoint": true, "copyToOutput": ["cache-file.txt"] }

      Note: example 1 is forthcoming. The inspiration has not arrived yet.

    • Caching 3 - Cache removal event

      Register callback when a cached value is removed.

    • Caching 4 - CancellationChangeToken dependency

      Bind several cache entries to a single dependency that you can reset manually.

  • Configuration (7)

    This section is all about configuration, from memory configuration to INI, JSON and XML.

    • Configuration

      This is the 'hello world' of configuration. Just use a memory based configuration and read/write values to/from it.

    • Configuration - Options

      Use IOptions at the most basic.

    • Configuration - Environment variables

      Load environment variables and display all of them.

    • Configuration - INI file

      Read from INI file. It requires taking a new dependency, "Microsoft.Extensions.Configuration.INI" : "1.1.0".

    • Configuration - INI file - Options

      Read from INI file (with nested keys) and IOptions. It requires taking two new dependencies, "Microsoft.Extensions.Configuration.INI" : "1.1.0" and "Microsoft.Extensions.Options.ConfigurationExtensions" : "1.1.0".

    • Configuration - XML file

      Read from XML file. It requires taking a new dependency, "Microsoft.Extensions.Configuration.Xml" : "1.1.0".

      Note: This Xml Configuration provider does not support repeated element.

      The following configuration settings will break:

      <appSettings>
        <add key="webpages:Version" value="3.0.0.0" />
        <add key="webpages:Enabled" value="false" />
      </appSettings>
      

      On the other hand you can get unlimited nested elements and also attributes.

    • Configuration - XML file - Options

      Read from XML file and use IOptions. It requires taking two new dependencies, "Microsoft.Extensions.Configuration.Xml" : "1.1.0" and "Microsoft.Extensions.Options.ConfigurationExtensions" : "1.1.0".

  • Localization and Globalization (4)

    This section is all about languages, culture, etc.

    • Localization

      Shows the most basic use of localization using a resource file. This sample only supports French language (because we are fancy). It needs the following dependency "Microsoft.AspNetCore.Localization": "1.1.0" and "Microsoft.Extensions.Localization": "1.1.0".

    • Localization - 2

      We build upon the previous sample and demonstrate how to switch request culture via query string using the built in QueryStringRequestCultureProvider. This sample supports English and French.

    • Localization - 3

      Demonstrate the difference between Culture and UI Culture.

    • Localization - 4

      Demonstrate how to switch request culture via cookie using the built in CookieRequestCultureProvider. This sample supports English and French.

  • URL Redirect/Rewriting (6)

    This section explore the dark arts of URL Rewriting

    • Rewrite

      Shows the most basic of URL rewriting which will redirect (returns HTTP 302) anything to the home page "/". It requires "Microsoft.AspNetCore.Rewrite" : "1.0.0-*" and "Microsoft.AspNetCore.Routing" : "1.1.0-*" dependencies. These two dependencies apply to the rest of the samples in this category.

      If you have used routing yet, I recommend of checking out the routing examples.

    • Rewrite - 2

      Redirect (returns HTTP 302) anything with an extension e.g. about-us.html or welcome.aspx to home page (/). It also shows how to capture the matched regex values.

    • Rewrite - 3

      Rewrite anything with an extension e.g. about-us.html or welcome.aspx to home page (/). It also shows how to capture the matched regex values.

    • Rewrite - 4

      Permanent Redirect (returns HTTP 301) anything with an extension e.g. about-us.html or welcome.aspx to home page (/). It also shows how to capture the matched regex values.

    • Rewrite - 5

      Implement a custom redirect logic based on IRule implementation. Require additional dependency of "Microsoft.AspNetCore.StaticFiles": "1.1.0" to serve images.

      This custom redirection logic allows us to simply specify the image file names without worrying about their exact path e.g.'xx.jpg' and 'yy.png'.

    • Rewrite - 6

      Implement a custom redirect logic using lambda (similar functionality to Rewrite - 5). Require additional dependency of "Microsoft.AspNetCore.StaticFiles": "1.1.0" to serve images.

      This custom redirection logic allows us to simply specify the image file names without worrying about their exact path e.g.'xx.jpg' and 'yy.png'.

  • Compression (1)

    Enable the ability to compress ASP.NET Core responses. These samples takes a dependency of Microsoft.AspNetCore.ResponseCompression": "1.0.1.

    • Default Gzip Output Compression

      Compress everything using the default Gzip compression.

      Everything means the following MIME output

      • text/plain
      • text/css
      • application/javascript
      • text/html
      • application/xml
      • text/xml
      • application/json
      • text/json
  • Misc (4)

    • Serve static files

      Simply serve static files (html, css, images, etc).

      This additional dependency is required to enable the functionality "Microsoft.AspNetCore.StaticFiles": "1.1.0".

      There are two static files being served in this project, index.html and hello.css. They are stored under wwwroot folder, which is the default folder location for this library.

      To access them you have to refer them directly e.g. localhost:5000/index.html and localhost:5000/hello.css.

    • Markdown server

      Serve markdown file as html file. You will see how you can create useful app using a few basic facilities in aspnetcore.

      We take "CommonMark.Net" : "0.13.4" as dependency.

    • Markdown server - implemented as middleware component

      Serve markdown file as html file. It has the same exact functionality as Markdown server but implemented using middleware component.

      We take "CommonMark.Net" : "0.13.4" as dependency.

      Check out the documentation on how to write your own middleware.

    • Password Hasher server

      Give it a string and it will generate a secure hash for you, e.g. localhost:5000?password=mypassword.

      We add dependency "Microsoft.AspNetCore.Identity": "1.1.0-*" to enable this functionality.

Other resources

These are other aspnetcore resources with code samples

Contributor Guidelines

  • Put all the code inside Program.cs. It makes it easier for casual users to read the code online and learn something. Sometimes it is too cumbersome to chase down types using browser.
  • Keep your sample very simple and specific. Try to minimise the amount of concept that people need to know in order to understand your code.
  • There is no sample that is too small. If it shows one single interesting and useful knoweldge, add it in.
  • When you are ready, update this document and add the link to the project with a paragraph or two. Do not forget to increment the sample count at the beginning of this document.

About

Practical samples of aspnet core projects you can use

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 100.0%