Search icon CANCEL
Subscription
0
Cart icon
Your Cart (0 item)
Close icon
You have no products in your basket yet
Save more on your purchases! discount-offer-chevron-icon
Savings automatically calculated. No voucher code required.
Arrow left icon
Explore Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Newsletter Hub
Free Learning
Arrow right icon
timer SALE ENDS IN
0 Days
:
00 Hours
:
00 Minutes
:
00 Seconds
Customizing ASP.NET Core 5.0
Customizing ASP.NET Core 5.0

Customizing ASP.NET Core 5.0: Turn the right screws in ASP.NET Core to get the most out of the framework

eBook
€20.99 €23.99
Paperback
€29.99
Paperback
€24.99
Subscription
Free Trial
Renews at €18.99p/m

What do you get with a Packt Subscription?

Free for first 7 days. $19.99 p/m after that. Cancel any time!
Product feature icon Unlimited ad-free access to the largest independent learning library in tech. Access this title and thousands more!
Product feature icon 50+ new titles added per month, including many first-to-market concepts and exclusive early access to books as they are being written.
Product feature icon Innovative learning tools, including AI book assistants, code context explainers, and text-to-speech.
Product feature icon Thousands of reference materials covering every tech concept you need to stay up to date.
Subscribe now
View plans & pricing
Table of content icon View table of contents Preview book icon Preview Book

Customizing ASP.NET Core 5.0

Chapter 2: Customizing App Configuration

This second chapter is about application configuration, how to use it, and how to customize the ASP.NET configuration to employ different ways to configure your app. Perhaps you already have an existing XML configuration, or want to share a YAML configuration file over different kinds of applications. Sometimes, it also makes sense to read configuration values out of a database.

In this chapter, we will be covering the following topics:

  • Configuring the configuration
  • Using typed configurations
  • Configuration using INI files
  • Configuration providers

The topics in this chapter refer to the hosting layer of the ASP.NET Core architecture:

Figure 2.1 – ASP.NET Core architecture

Figure 2.1 – ASP.NET Core architecture

Technical requirements

To follow the descriptions in this chapter, you will need to create an ASP.NET Core MVC application. Open your console, shell, or bash terminal, and change to your working directory. Use the following command to create a new MVC application:

dotnet new mvc -n ConfigureSample -o ConfigureSample

Now, open the project in Visual Studio by double-clicking the project file or, in VS Code, by typing the following command in the already open console:

cd ConfigureSample
code.

All of the code samples in this chapter can be found in the GitHub repository for this book at https://github.com/PacktPublishing/Customizing-ASP.NET-Core-5.0/tree/main/Chapter02.

Configuring the configuration

Let's start by looking at how to configure your various configuration options.

Since ASP.NET Core 2.0, the configuration is hidden in the default configuration of WebHostBuilder, and no longer part of Startup.cs. This helps to keep the startup clean and simple.

In ASP.NET Core 3.1 and ASP.NET Core 5.0, the code looks like this:

// ASP.NET Core 3.0 and later
public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }
    public static IHostBuilder CreateHostBuilder(string[]       args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            }
}

Fortunately, you are also able to override the default settings to customize the configuration in a way you need it.

When you create a new ASP.NET Core project, you will already have appsettings.json and appsettings.Development.json configured. You can, and should, use these configuration files to configure your app; this is the pre-configured way, and most ASP.NET Core developers will look for an appsettings.json file to configure the application. This is absolutely fine and works pretty well.

The following code snippet shows the encapsulated default configuration to read the appsettings.json files:

Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder
          .ConfigureAppConfiguration((builderContext, 
             config) =>
        {
            var env = builderContext.HostingEnvironment;
            config.SetBasePath(env.ContentRootPath);
            config.AddJsonFile(
                "appsettings.json", 
                optional: false, 
                reloadOnChange: true);
            config.AddJsonFile(
                $"appsettings.{env.EnvironmentName}.json", 
                optional: true, 
                reloadOnChange: true);
            config.AddEnvironmentVariables();
        })
        .UseStartup<Startup>();
    });

This configuration also sets the base path of the application and adds the configuration via environment variables. The ConfigureAppConfiguration method accepts a lambda method that gets WebHostBuilderContext and ConfigurationBuilder passed in.

Whenever you customize the application configuration, you should add the configuration via environment variables as a final step, using the AddEnvironmentVariables() method. The order of the configuration matters, and the configuration providers that you add later on will override the configurations added previously. Be sure that the environment variables always override the configurations that are set via a file. This way, you also ensure that the configuration of your application on an Azure App Service will be passed to the application as environment variables.

IConfigurationBuilder has a lot of extension methods to add more configurations, such as XML or INI configuration files, and in-memory configurations. You can find additional configuration providers built by the community to read in YAML files, database values, and a lot more. In an upcoming section, we will see how to read INI files. First, we will look at using typed configurations.

Using typed configurations

Before trying to read INI files, it makes sense for you to see how to use typed configurations instead of reading the configuration via IConfiguration, key by key.

To read a typed configuration, you need to define the type to configure. I usually create a class called AppSettings, as follows:

public class AppSettings
{
    public int Foo { get; set; }
    public string Bar { get; set; }
}

This is a simple POCO class that will only contain the application setting values. These classes can then be filled with specific configuration sections inside the ConfigureServices method in Startup.cs:

services.Configure<AppSettings>
   (Configuration.GetSection("AppSettings"));

This way, the typed configuration also gets registered as a service in the dependency injection container and can be used everywhere in the application. You are able to create different configuration types for each configuration section. In most cases, one section should be fine, but sometimes it makes sense to divide the settings into different sections. The next snippet shows how to use the configuration in an MVC controller:

public class HomeController : Controller
{
    private readonly AppSettings _options;
    public HomeController(IOptions<AppSettings> options)
    {
        _options = options.Value;
    }

IOptions<AppSettings> is a wrapper around our AppSettings type, and the Value property contains the actual instance of AppSettings, including the values from the configuration file.

To try that, the appsettings.json file needs to have the AppSettings section configured, otherwise the values are null or not set. Let's now add the section to appsettings.json:

{
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "AllowedHosts": "*",
    "AppSettings": {
        "Foo": 123,
        "Bar": "Bar"
    }
}

Next, we'll examine how INI files can be used for configuration.

Configuration using INI files

To also use INI files to configure the application, you will need to add the INI configuration inside the ConfigureAppConfiguration() method in Program.cs:

config.AddIniFile(
    "appsettings.ini", 
    optional: false, 
    reloadOnChange: true);
config.AddJsonFile(
    $"appsettings.{env.EnvironmentName}.ini", 
    optional: true, 
    reloadOnChange: true);

This code loads the INI files the same way as the JSON configuration files. The first line is a required configuration, and the second line is an optional configuration depending on the current runtime environment.

The INI file could look like this:

[AppSettings]
Bar="FooBar"

As you can see, this file contains a section called AppSettings and a property called Bar.

Earlier, we said that the order of the configuration matters. If you add the two lines to configure via INI files after the configuration via JSON files, the INI files will override the settings from the JSON files. The Bar property gets overridden with "FooBar" and the Foo property stays the same, because it will not be overridden. Also, the values out of the INI file will be available via the typed configuration created previously.

Every other configuration provider will work the same way. Let's now see how a configuration provider will look.

Configuration providers

A configuration provider is an implementation of IConfigurationProvider that is created by a configuration source, which is an implementation of IConfigurationSource. The configuration provider then reads the data from somewhere and provides it via Dictionary.

To add a custom or third-party configuration provider to ASP.NET Core, you will need to call the Add method on ConfigurationBuilder and insert the configuration source. This is just an example:

Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        
       webBuilder.ConfigureAppConfiguration((builderContext, 
         config) =>
        {
            var env = builderContext.HostingEnvironment;
            config.SetBasePath(env.ContentRootPath);
            config.AddJsonFile(
                "appsettings.json", 
                optional: false, 
                reloadOnChange: true);
            config.AddJsonFile(
                $"appsettings.{env.EnvironmentName}.json",
                optional: true, 
                reloadOnChange: true);
            // add new configuration source
            config.Add(new MyCustomConfigurationSource
            {
                SourceConfig = //configure whatever source
                Optional = false,
                ReloadOnChange = true
            });
            config.AddEnvironmentVariables();
        })
        .UseStartup<Startup>();
    });

Usually, you would create an extension method to add the configuration source more easily:

config.AddMyCustomSource("source", optional: false, 
     reloadOnChange: true);

A really detailed concrete example about how to create a custom configuration provider has been written by Andrew Lock. You can find this in the Further reading section of this chapter.

Summary

In most cases, you will not need to add a different configuration provider or to create your own configuration provider, but it's good to know how to change it, just in case. Also, using typed configuration is a nice way to read and provide the settings. In classic ASP.NET, we used a manually created façade to read the application settings in a typed manner. Now, this is automatically done by just providing a type. This type will be automatically instantiated, filled, and provided, via a dependency injection.

To learn more about customizing dependency injection in ASP.NET Core 5.0, let's have a look at the next chapter.

Further reading

Andrew Lock, Creating a custom ConfiguationProvider in ASP.NET Core: https://andrewlock.net/creating-a-custom-iconfigurationprovider-in-asp-net-core-to-parse-yaml/.

Left arrow icon Right arrow icon
Download code icon Download Code

Key benefits

  • Customize the default behavior of ASP.NET Core to get the most out of the framework
  • Enhance the app configuration, change the default dependency injection, and build your own tag helpers
  • Discover best practices for configuring ASP.NET Core, from user interface design to hosting it on platforms

Description

ASP.NET Core is the most powerful Microsoft web framework. Although it’s full of rich features, sometimes the default configurations can be a bottleneck and need to be customized to suit the nature and scale of your app. If you’re an intermediate-level .NET developer who wants to extend .NET Core to multiple use cases, it's important to customize these features so that the framework works for you effectively. Customizing ASP.NET Core 5.0 covers core features that can be customized for developing optimized apps. The customization techniques are also updated to work with the latest .NET 5 framework. You’ll learn essential concepts relating to optimizing the framework such as configuration, dependency injection, routing, action filters, and more. As you progress, you’ll be able to create custom solutions that meet the needs of your use case with ASP.NET Core. Later chapters will cover expert techniques and best practices for using the framework for your app development needs, from UI design to hosting. Finally, you’ll focus on the new endpoint routing in ASP.NET Core to build custom endpoints and add third-party endpoints to your web apps for processing requests faster. By the end of this application development book, you’ll have the skills you need to be able to customize ASP.NET Core to develop robust optimized apps.

Who is this book for?

This .NET 5 book is for .NET developers who need to change the default behaviors of the framework to help improve the performance of their applications. Intermediate-level knowledge of ASP.NET Core and C# is required before getting started with the book.

What you will learn

  • Explore various application configurations and providers in ASP.NET Core 5
  • Understand dependency injection in .NET and learn how to add third-party DI containers
  • Discover the concept of middleware and write your own middleware for ASP.NET Core apps
  • Create various API output formats in your API-driven projects
  • Get familiar with different hosting models for your ASP.NET Core app
  • Develop custom routing endpoints and add third-party endpoints
  • Configure WebHostBuilder effectively for your web applications

Product Details

Country selected
Publication date, Length, Edition, Language, ISBN-13
Publication date : Jan 28, 2021
Length: 160 pages
Edition : 1st
Language : English
ISBN-13 : 9781801077866
Vendor :
Microsoft
Languages :
Tools :

What do you get with a Packt Subscription?

Free for first 7 days. $19.99 p/m after that. Cancel any time!
Product feature icon Unlimited ad-free access to the largest independent learning library in tech. Access this title and thousands more!
Product feature icon 50+ new titles added per month, including many first-to-market concepts and exclusive early access to books as they are being written.
Product feature icon Innovative learning tools, including AI book assistants, code context explainers, and text-to-speech.
Product feature icon Thousands of reference materials covering every tech concept you need to stay up to date.
Subscribe now
View plans & pricing

Product Details

Publication date : Jan 28, 2021
Length: 160 pages
Edition : 1st
Language : English
ISBN-13 : 9781801077866
Vendor :
Microsoft
Languages :
Tools :

Packt Subscriptions

See our plans and pricing
Modal Close icon
€18.99 billed monthly
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Simple pricing, no contract
€189.99 billed annually
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Choose a DRM-free eBook or Video every month to keep
Feature tick icon PLUS own as many other DRM-free eBooks or Videos as you like for just €5 each
Feature tick icon Exclusive print discounts
€264.99 billed in 18 months
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Choose a DRM-free eBook or Video every month to keep
Feature tick icon PLUS own as many other DRM-free eBooks or Videos as you like for just €5 each
Feature tick icon Exclusive print discounts

Frequently bought together


Stars icon
Total 122.97
Customizing ASP.NET Core 5.0
€29.99
ASP.NET Core 5 Secure Coding Cookbook
€32.99
C# 10 and .NET 6 – Modern Cross-Platform Development
€59.99
Total 122.97 Stars icon

Table of Contents

14 Chapters
Chapter 1: Customizing Logging Chevron down icon Chevron up icon
Chapter 2: Customizing App Configuration Chevron down icon Chevron up icon
Chapter 3: Customizing Dependency Injection Chevron down icon Chevron up icon
Chapter 4: Configuring and Customizing HTTPS with Kestrel Chevron down icon Chevron up icon
Chapter 5: Using IHostedService and BackgroundService Chevron down icon Chevron up icon
Chapter 6: Writing Custom Middleware Chevron down icon Chevron up icon
Chapter 7: Content Negotiation Using a Custom OutputFormatter Chevron down icon Chevron up icon
Chapter 8: Managing Inputs with Custom ModelBinders Chevron down icon Chevron up icon
Chapter 9: Creating a Custom ActionFilter Chevron down icon Chevron up icon
Chapter 10: Creating Custom TagHelpers Chevron down icon Chevron up icon
Chapter 11: Configuring WebHostBuilder Chevron down icon Chevron up icon
Chapter 12: Using Different Hosting Models Chevron down icon Chevron up icon
Chapter 13: Working with Endpoint Routing Chevron down icon Chevron up icon
Other Books You May Enjoy Chevron down icon Chevron up icon

Customer reviews

Top Reviews
Rating distribution
Full star icon Full star icon Full star icon Full star icon Half star icon 4.1
(8 Ratings)
5 star 50%
4 star 37.5%
3 star 0%
2 star 0%
1 star 12.5%
Filter icon Filter
Top Reviews

Filter reviews by




Ricardo Jorge Melo Jóia Mar 07, 2021
Full star icon Full star icon Full star icon Full star icon Full star icon 5
This is not a book for beginners, the author assumes you already know at least the basics about ASP.NET Core and you're looking to, as the book name suggests, customize the default behavior.One thing that I like particularly is that each chapter is self-contained, by that, I mean that the author explains how to start a new project and implement the particular example from scratch, often, other authors use the same solution across the whole book, and reuse snippets from another chapter, if you're not following along and you want to test just something you might get into a situation where you can't implement the given example due to some part of the solution is missing, anyway, that won't happen if you try to implement any of this book's examples.Another thing is that the author doesn't assume his way is the best, and not only suggests you look for other ways to implement that solution but also refers the readers to blog posts and other resources so you can learn a different perspective and decide which solution is the best for your case.The author explains what's the scope for each chapter and tries to give some examples of use-cases where such customization might be used or important, such as, using a 3rd Party Dependency Injection Container, customizing HTTPS with Kestrel, creating custom ActionFilters, TagHelpers, etc...This book is what I classify as a "cookbook" and definitely one book to have at hand to use in the real world.
Amazon Verified review Amazon
Robert Frey Apr 25, 2021
Full star icon Full star icon Full star icon Full star icon Full star icon 5
I really love this book. It has several real world approaches to improving code and writing better software systems; especially if you are a seasoned .Net developer who wants to brush up on enterprise coding practices. I would recommend this to anyone looking to add to their skill set in .Net while moving to .Net 5 platform.
Amazon Verified review Amazon
Ron Clabo Apr 27, 2021
Full star icon Full star icon Full star icon Full star icon Full star icon 5
I’d especially recommend this book as a developer’s 2nd book on ASP.NET Core once they have read through an “I’m starting from scratch” beginner book. The content in this book will build on that intro.Such a developer will find the following customizations covered by this book particularly useful: logging, configuration, dependency injection, writing middleware, model binding, ActionFilters, TagHelpers and Endpoint Routing. While some of those maybe covered in an intro book, it’s helpful having a 2nd resource on these topics as they from the backbone for how ASP.NET Core works.Many will find it nice that this book doesn’t spend a lot of time wading through theory, but rather gets you to usable code very quickly. And the book even covers a few more advanced topics like IHostedService , BackgroundService and hosting on NGINX or Apache on Linux..NET Core opens up so many new doors and this book will help you walk through them.
Amazon Verified review Amazon
Binit Datta Apr 25, 2021
Full star icon Full star icon Full star icon Full star icon Full star icon 5
The title of the book got me interested. While there are lots of books teaching the .NET Core 3/5, a Productionzed Microservices has different requirements. I would not like to choose the .NET 5 Framework for a specific application/set of Microservices and then dive into the extensive documentation to learn how to meet these production environment requirements like configuring logging, telling the Microservice how to retrieve configuration, etc. Learning Curve and shortening the learning curve i.e. 160 pages is absolutely critical for me.On the configuration requirements alone, while .NET 5 does a commendable job that matches other popular Microservices frameworks like SpringBoot, there is hardly a one size fits all. Different companies may have different standards, central repositories, and other platforms where configuration is hosted. Besides, a production environment will need HTTPS, and learning how to do that with Kestrel in chapter 4 is a critical value addition. Running software in the background, writing custom middleware, customizing different formatters for different outputs, binding objects with different inputs, writing custom tag helper are great lessons. Finally, understanding the varieties of .NET Core 5.0 deployment models in chapter 12 and learning how to route requests in chapter 13 are the icing on the cake.The best part is its size total of 161 pages, teaching so many great things transforming a .NET Core developer from a laptop/desktop developer to a production-focused developer.Highly recommended, and I am using it for my teams as well!Thanks,Binit
Amazon Verified review Amazon
Adwait Ullal Apr 22, 2021
Full star icon Full star icon Full star icon Full star icon Empty star icon 4
The book, Customizing ASP.NET Core 5.0, deals with tweaking the knobs at various layers:- WebAPI- Razor Pages- MVC/SignalR/gRPC/Blazor/etc.- Routing- Middleware- Hostsuch customizing logging, dependency injection or writing custom middleware.Each chapter indicates what layer is that particular tweak related to and goes in-depth the pros and cons of the tweak.I enjoyed this comprehensive book and would have it as a handy companion during design and performance tuning sessions.
Amazon Verified review Amazon
Get free access to Packt library with over 7500+ books and video courses for 7 days!
Start Free Trial

FAQs

What is included in a Packt subscription? Chevron down icon Chevron up icon

A subscription provides you with full access to view all Packt and licnesed content online, this includes exclusive access to Early Access titles. Depending on the tier chosen you can also earn credits and discounts to use for owning content

How can I cancel my subscription? Chevron down icon Chevron up icon

To cancel your subscription with us simply go to the account page - found in the top right of the page or at https://subscription.packtpub.com/my-account/subscription - From here you will see the ‘cancel subscription’ button in the grey box with your subscription information in.

What are credits? Chevron down icon Chevron up icon

Credits can be earned from reading 40 section of any title within the payment cycle - a month starting from the day of subscription payment. You also earn a Credit every month if you subscribe to our annual or 18 month plans. Credits can be used to buy books DRM free, the same way that you would pay for a book. Your credits can be found in the subscription homepage - subscription.packtpub.com - clicking on ‘the my’ library dropdown and selecting ‘credits’.

What happens if an Early Access Course is cancelled? Chevron down icon Chevron up icon

Projects are rarely cancelled, but sometimes it's unavoidable. If an Early Access course is cancelled or excessively delayed, you can exchange your purchase for another course. For further details, please contact us here.

Where can I send feedback about an Early Access title? Chevron down icon Chevron up icon

If you have any feedback about the product you're reading, or Early Access in general, then please fill out a contact form here and we'll make sure the feedback gets to the right team. 

Can I download the code files for Early Access titles? Chevron down icon Chevron up icon

We try to ensure that all books in Early Access have code available to use, download, and fork on GitHub. This helps us be more agile in the development of the book, and helps keep the often changing code base of new versions and new technologies as up to date as possible. Unfortunately, however, there will be rare cases when it is not possible for us to have downloadable code samples available until publication.

When we publish the book, the code files will also be available to download from the Packt website.

How accurate is the publication date? Chevron down icon Chevron up icon

The publication date is as accurate as we can be at any point in the project. Unfortunately, delays can happen. Often those delays are out of our control, such as changes to the technology code base or delays in the tech release. We do our best to give you an accurate estimate of the publication date at any given time, and as more chapters are delivered, the more accurate the delivery date will become.

How will I know when new chapters are ready? Chevron down icon Chevron up icon

We'll let you know every time there has been an update to a course that you've bought in Early Access. You'll get an email to let you know there has been a new chapter, or a change to a previous chapter. The new chapters are automatically added to your account, so you can also check back there any time you're ready and download or read them online.

I am a Packt subscriber, do I get Early Access? Chevron down icon Chevron up icon

Yes, all Early Access content is fully available through your subscription. You will need to have a paid for or active trial subscription in order to access all titles.

How is Early Access delivered? Chevron down icon Chevron up icon

Early Access is currently only available as a PDF or through our online reader. As we make changes or add new chapters, the files in your Packt account will be updated so you can download them again or view them online immediately.

How do I buy Early Access content? Chevron down icon Chevron up icon

Early Access is a way of us getting our content to you quicker, but the method of buying the Early Access course is still the same. Just find the course you want to buy, go through the check-out steps, and you’ll get a confirmation email from us with information and a link to the relevant Early Access courses.

What is Early Access? Chevron down icon Chevron up icon

Keeping up to date with the latest technology is difficult; new versions, new frameworks, new techniques. This feature gives you a head-start to our content, as it's being created. With Early Access you'll receive each chapter as it's written, and get regular updates throughout the product's development, as well as the final course as soon as it's ready.We created Early Access as a means of giving you the information you need, as soon as it's available. As we go through the process of developing a course, 99% of it can be ready but we can't publish until that last 1% falls in to place. Early Access helps to unlock the potential of our content early, to help you start your learning when you need it most. You not only get access to every chapter as it's delivered, edited, and updated, but you'll also get the finalized, DRM-free product to download in any format you want when it's published. As a member of Packt, you'll also be eligible for our exclusive offers, including a free course every day, and discounts on new and popular titles.

Modal Close icon
Modal Close icon