Is ASP.NET Core now a Mature Platform?

Rocket

Update (12 January 2019)

It seems that Damian Edwards (The ASP.NET Core Project Manager) likes this post and agrees with the points I've made! It's great to hear that he's is in alignment with my thoughts and that's a great indication that the pain points of the platform will get solved in the future. Take a look at what he says in the ASP.NET Community Stand-up below:

The Upgrade Train

I started using ASP.NET Core back when it was still called ASP.NET 5 and it was still in beta. In those early days every release introduced a sea change. The beta's were not beta's at all but more like alpha quality bits. I spent more time than I'd like just updating things to the latest version with each release.

Compared to the past, updates are moving at a glacial pace. Compared to the full fat .NET Framework though, it's been like moving from a camel to an electric car. When releases do come there is still a lot in each release. If you have a number of micro services using ASP.NET Core, it's not quick to get them all updated. Also, it's not just ASP.NET Core but all of the satellite assemblies built on top of .NET Core that keep changing too, things like Serilog and Swashbuckle.

What about other platforms? Well, I'm familiar with Node.js and the situation there is bordering on silly. Packages are very unstable and constantly being rev'ed. Keeping up and staying on latest is a constant battle almost every day. Each time you upgrade a package, there is also a danger that you will break something. With .NET Core, there are fewer packages and they are much more stable.

Overall, things move fast in software development in general and for me that's what keeps it interesting. ASP.NET Core is no exception.

Show me the API's!

.NET Core and ASP.NET Core started out very lightweight. There were few API's available. You often had to roll your own code, even for basic features that should exist.

In today's world, a lot of API's have been added and where there are gaps, the community has filled them in many places. The .NET Framework still has a lot of API's that have not been ported across yet. A lot of these gaps are Windows specific and I'm sure a lot will be filled in the .NET Core 3.0 time frame.

When I make a comparison with Node.js and take wider community packages into consideration, I'd say that .NET Core has fewer API's. Image compression API's don't even exist on .NET for example. We were late to the party with Brotli compression which was recently added to .NET Core and is soon going to be added to the ASP.NET Core compression middleware, so we'll get there eventually. We have GraphQL.NET which is very feature rich but it still lags behind the JavaScript Apollo implementation slightly where it has first party support (Perhaps that comparison is a little unfair as GraphQL is native to Node.js). When I wanted to add Figlet font support to Colorful.Console (Figlet fonts let you draw characters using ASCII art), I had to base my implementation off of a JavaScript one. I'm not the only one who translates JavaScript code to C# either.

With all this said, Node.js and JavaScript in general has it's own unique problems, otherwise I'd be using it instead of being a mainly .NET Core developer.

It's Open Sauce

Making .NET Core and ASP.NET Core open source has made a huge difference. We'd all occasionally visit the .NET Framework docs to understand how an API worked but today the place to go is GitHub where you can not only see the code but read other peoples issues and even raise issues of your own. There is often someone who has been there and done it all before you.

Not only that but a huge community has grown up with bloggers and new projects being more commonplace. It cannot be underestimated how much this change has improved a developers standard of living. Just take a look at the brilliant discoverdot.net site where you can see 634 GitHub .NET projects for all the evidence you need.

Feel the Powa!

ASP.NET Core's emphasis on performance is refreshing. It's doing well in the TechEmpower benchmarks with more improvements in sight. It's nice to get performance boosts from your applications every time you upgrade your application without having to do any work at all yourself.

While the platform is miles ahead of Node.js there are newer languages like Go that are also quite nice to write code for but blazing fast too. However, I'm not sure you can be as productive writing Go as with .NET Core. Also, you've got to use the write tool for the job. There are definitely cases where Go does a better job.

One interesting effort that I've been keeping an eye on for some time now is .NET Native where C# code is compiled down to native code instead of an intermediate language. This means that the intermediate language does not need to be JIT'ed and turned into machine code at runtime which speeds up execution the first time the application is run. A nice side effect of doing this is that you also end up with a single executable file. You get all the benefits of a low level language like Go or Rust with none of the major drawbacks! I've been expecting this to hit for some time now but it's still not quite ready.

Security is Boring but Important

This is a subject that most people have never thought about much. It's trivial for an evil doer to insert some rogue code into an update to a package and have that code running in applications soon after. In fact that's what happened with the event-stream NPM package recently. I highly recommend reading Jake Archibald's post "What happens when packages go bad".

What about .NET Core? Well, .NET is in fairly rare position of having a large number of official packages written by and maintained by Microsoft. This means that you need less third party packages and in fact you can sometimes get away with using no third party dependencies what so ever. What this also means, is that your third party dependencies that you do end up using also have fewer other dependencies in turn.

NuGet also recently added support for signed packages, which stops packages from being tampered with between NuGet's server and your build machine.

Overall this is all about reducing risk. There will always be a chance that somebody will do something bad. I'd argue that there is less of a risk of that happening on the .NET platform.

Who is using it?

Bing.com is running on ASP.NET Core and a site doesn't get much bigger than that. Stack Overflow is working on their transition to .NET Core. The Orchard CMS uses .NET Core. Even WordPress and various PHP applications can be run on .NET Core these days using peachpie.

What's Still Missing?

First of all, let me say that every platform has gaps that are sometimes filled by the community. There are several missing API's that seem obvious to me but have yet to be built or improved enough. Here are a few basic examples of things that could be improved and where maybe the small team of 20 ASP.NET Core developers (Yes, their team is that small and they've done a tremendous job of building so much with so few resources, so they definitely deserve a pat on the back) could perhaps better direct their efforts.

Caching Could be Better

The response caching still only supports in-memory caching. If you want to cache to Redis using the IDistributedCache, bad luck. Even if you go with it and use the in-memory cache, if you're using cookies or the Authorization HTTP header, you've only got more bad luck as response caching turns itself off in those cases. Caching is an intrinsic part of the web, we need to do a better job of making it easier to work with.

Everyone is Partying with Lets Encrypt

Security is hard! HTTPS is hard! Dealing with certificates is hard! What if you could use some middleware and supply it with a couple of lines of configuration and never have to think about any of it ever again? Isn't that something you'd want? Well, it turns out that Nate McMaster has built a LetsEncrypt middleware that does just that but he needs some help to persuade his boss to build the feature, so up-vote this issue.

Microsoft seems a bit late to the part, it's also one of the top voted feature requests on Azure's User Voice too.

HTTP/2 and HTTP/3

HTTP/2 support in ASP.NET Core is available in 2.2 but it's not battle tested so you can't run it at the edge, wide open to the internet for fear of getting hacked.

HTTP/3 (formerly named QUIC) support has been talked about and the ground work for it has already been done so that the Kestrel web server can support multiple protocols easily. Lets see hoq quickly we can get support.

One interesting thing about adding support for more protocols to ASP.NET Core is that most people can't make use of them or don't need to. ASP.NET Core applications are often hidden away behind a reverse proxy web server like IIS or NGINX who implement these protocols themselves. Even using something like Azure App Service means that you run behind a special fork of IIS. So I've been thinking, what is the point? Well, you've could use Kubernetes to expose your ASP.NET Core app over port 80 and get the performance boost of not having to use a reverse proxy web server as a man in the middle. Also, contrary to popular belief, Kubernetes can expose multiple ASP.NET Core applications over port 80 (at least Azure AKS can).

Serving Static Files

Serving static files is one of the most basic features. There are a few things that could make this a lot better. You can't use the authorization middleware to limit access to static files but I believe that's changing in ASP.NET Core 3.0. Serving GZIP'ed or Brotli'ed content is a must today. Luckily dynamic Brotli compression will soon be available. What's not available is serving pre-compressed static files.

Is It A Mature Platform?

There is a lot less churn. There are a lot of open source projects you can leverage. A large enough developer base has now grown up, so you see a lot more GitHub projects, Stack Overflow questions, bloggers like myself and companies who make their living from the platform.

There seems to be a trend at the moment where people are jumping ship from long standing platforms and languages to brand new ones. Android developers have jumped from Java to Kotlin (and have managed to delete half their code in the process, Java is so verbose!). The poor souls who wrote Objective C, have jumped to Swift. Where once applications would be written in C++, they are now written in Go or Rust. Where once people wrote JavaScript, they are still writing JavaScript (TypeScript has taken off but not completely)...ok that has not changed. .NET Core seems to be the only one that seems to have bucked the trend and tried to reinvent itself completely while not changing things too much and still succeeding in the process.

So yes, yes it is, is my answer.

Web Mentions

What's this?

0 Replies

GitHub Comments

RehanSaeed

Jorge Jorge commented on 2018-12-18 15:55:59

Great article, I've been looking for this kind of insight for a long time, folks here are afraid of using .net core and it's relieving to read this.

RehanSaeed

Dmitry Pavlov Dmitry Pavlov commented on 2018-12-18 16:58:02

For sure. I have completely switched to it and 3rd year deal with ASP.NET Core projects only. Much easier and elegant configuration, common development tasks handling, and in general - pleasure to work with it.

RehanSaeed

Gianluigi Liguori Gianluigi Liguori commented on 2018-12-18 21:33:08

Amazing article. I was already convinced to answer 'YES', after this, it is a '101%' yes. :)

RehanSaeed

Nirman Doshi Nirman Doshi commented on 2018-12-19 06:47:14

Nice article, and overview of all aspects are covered. This means, .NET core is now more than ready ever for large enterprise application.
Thanks

RehanSaeed

Vincent Jenks Vincent Jenks commented on 2018-12-19 14:32:13

Not really fair to throw Node under the bus in your comparisons. I've been a dotnet dev since it has been a thing, and I still love it, but I've had wonderful results with Node the past few years. Much faster dev cycle, much easier to maintain and deploy, and the biggest open source package repository known to software development. It's great! I think Core and dotnet in general, still has a long way to go. I hope it catches up to compete! Would love to work with it professionally, again.

RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2018-12-19 14:38:57

Not really fair to throw Node under the bus in your comparisons. I've been a dotnet dev since it has been a thing, and I still love it, but I've had wonderful results with Node the past few years. Much faster dev cycle, much easier to maintain and deploy, and the biggest open source package repository known to software development. It's great! I think Core and dotnet in general, still has a long way to go. I hope it catches up to compete! Would love to work with it professionally, again.

That was not my intention at all, totally my fault if that is what is coming across. There are things Node can do that .NET can't. In fact, I think I mentioned that myself and others have ported JavaScript/Node code to C# because it didn't exist on the .NET platform. As you say, the fast get up and go factor with Node is really one of it's great selling points. I just didn't mention it because it wasn't the subject of the post.

RehanSaeed

Dan Dan commented on 2018-12-19 16:57:32

For sure. I have completely switched to it and 3rd year deal with ASP.NET Core projects only. Much easier and elegant configuration, common development tasks handling, and in general - pleasure to work with it.

Can you explain please more, what did you feel migrating your existing applications from older versions of the .Net Core to the newer ones till these 3 years

RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2018-12-19 17:01:47

Can you explain please more, what did you feel migrating your existing applications from older versions of the .Net Core to the newer ones till these 3 years

Honestly, it was a pain. Older versions of .NET Core changed a lot more than say 2.2 which was released recently. Moving forward, there is less churn and breaking changes, so now is a good time to use .NET Core.

RehanSaeed

Kaushik Roy Chowdhury Kaushik Roy Chowdhury commented on 2018-12-20 00:32:28

Hi Rehan,

A very insightful article from a person who knows the subject and what he's talking about. I have come to like ASP.Net Core after having implemented several DIY projects from asp.net website of Microsoft and putting these on GitHub.

Personally I have also been tutoring ASP.Net Core on my YouTube channel (https://www.youtube.com/c/KaushikRoyChowdhury-deveducate) on specific playlists, with video tutorials made mainly out of the ASP.Net Core tutorials documented by ASP.Net Core group of collaborators. They are quite supportive as on date.

However I still consider myself at a beginner (having taken it from 2.0 version on) level and I shall also like to take my knowledge in ASP.Net Core to a specialized level.

Any advice will be highly regarded.

RehanSaeed

Steed Steed commented on 2018-12-20 07:30:30

You should deff look at nswag. The idea of centralized models between all your microservices including your angular/js frontend has long been a holy grail that devs quested for. Now with nswag, this promise seems to be true.

RehanSaeed

Ahmad Mozaffar Ahmad Mozaffar commented on 2018-12-20 09:48:21

Very nice article
Keep going

RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2018-12-20 10:33:48

Hi Rehan,

A very insightful article from a person who knows the subject and what he's talking about. I have come to like ASP.Net Core after having implemented several DIY projects from asp.net website of Microsoft and putting these on GitHub.

Personally I have also been tutoring ASP.Net Core on my YouTube channel (https://www.youtube.com/c/KaushikRoyChowdhury-deveducate) on specific playlists, with video tutorials made mainly out of the ASP.Net Core tutorials documented by ASP.Net Core group of collaborators. They are quite supportive as on date.

However I still consider myself at a beginner (having taken it from 2.0 version on) level and I shall also like to take my knowledge in ASP.Net Core to a specialized level.

Any advice will be highly regarded.

I don't think any developers who blog make a living from it. At best it can help differentiate you from other candidates in a job interview. I write blog posts because it can be fun, interacting with readers is fun. I also come back and read my own posts sometimes to see how something is done.

In terms of advice, blog frequently and have a mix of interesting content. I'm not sure there is more advice I can offer.

Hope that helps.

RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2018-12-20 10:34:26

You should deff look at nswag. The idea of centralized models between all your microservices including your angular/js frontend has long been a holy grail that devs quested for. Now with nswag, this promise seems to be true.

Will take a look at NSwag, definately feels like that is where the community is moving.

RehanSaeed

Ashmeet Singh Ashmeet Singh commented on 2018-12-21 03:39:39

Why is dotnet core propagation in startups so low? Correct me if this statement is incorrect. What is your take on it?

RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2018-12-21 09:34:14

Why is dotnet core propagation in startups so low? Correct me if this statement is incorrect. What is your take on it?

Probably a number of factors:

  1. Some people still think about the old Micro$oft and it's bad ways. In the past Microsoft has also not been very good with open source.
  2. .NET Core is still fairly new and gaining in popularity as compared to other frameworks which have been around for longer.
  3. There may be a negative association with the old .NET Framework which is considered heavy and slow.
  4. Microsoft gives incentives to startups. Maybe it should do this more.
  5. Universities don't teach .NET Core, they prefer Java and C++ in my experience due to the open and free nature of the tools used with those languages. This will literally take a generation to change as new professors are trained and enter the workplace.
  6. Is .NET Core cool? I don't know. Go and Rust seem to be what's 'cool' at the moment.
  7. .NET has an image problem, people think enterprises use it.

Some reasons off the top of my head. Not sure if any are true. Probably missing quite a few reasons.

RehanSaeed

Shahdat Hosain Shahdat Hosain commented on 2019-01-13 00:53:27

I would add nopCommerce in "Who is using it?" using it section. nopCommerce is open source one of the popular e-commerce platform which is built on ASP.NET Core.

RehanSaeed

rod macdonald rod macdonald commented on 2019-01-13 01:07:27

ASP.NET Core will be a mature platform when .NET Core has embraced WebAssembly and the future of a unified XAML and HTML UI is clear.

RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2019-01-14 08:52:26

ASP.NET Core will be a mature platform when .NET Core has embraced WebAssembly and the future of a unified XAML and HTML UI is clear.

When Blazor (which uses WebAssembly) came out I was really excited (I did a lot of WPF/Silverlight/Windows Phone 7, 8/UWP/XAML a few years ago). However, I now suspect that it won't catch on outside of the enterprise companies. That's not to say that Blazor is not cool and the XAML developer in me doesn't love it, but I don't think it will be as wildly popular as some people think.

Why? Well, in the real world when you build a site using say React or Vue, you also use a bunch of other libraries to get things done and right now Blazor simply does not have that massive pool of open source projects available to it. Also, you know what other language can be compiled to WebAssembly? JavaScript! There is already a lot of web based software built in JavaScript, while all other WebAssembly languages (like Rust which seems to be the most popular) simply do not, they just need to flip a compiler switch and they can compile to WebAssembly.

I've thought about blogging about this but I don't want to come off so negative...

RehanSaeed

Tony Tony commented on 2019-01-14 18:07:02

My time is too valuable. I'm waiting for things to stabilize. When 3.0 is released, I will take a look at it. I look forward to the performance improvements.

RehanSaeed
(edited )

Keith Thomas Keith Thomas commented on 2019-01-23 21:32:37

The poor souls who wrote Objective C, have jumped to Swift.

Poor souls? Objective-C jobs pay very well actually.

"Well, I'm familiar with Node.js and the situation there is bordering on silly. Packages are very unstable and constantly being rev'ed. Keeping up and staying on latest is a constant battle almost every day."

Why would anyone want to keep Node.js and all NPM packages up to date in a project almost every day? Maybe every few months at most, unless there are security issues reported in a package and you are required to install a newer version of it. If a JavaScript project is stable and working then there is not much to be gained from constant updates.

RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2019-01-24 09:47:41

My time is too valuable. I'm waiting for things to stabilize. When 3.0 is released, I will take a look at it. I look forward to the performance improvements.

Everyone has a different level of stability they require and their own risk profile. That's a valid decision.

RehanSaeed
(edited )

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2019-01-24 09:50:29

The poor souls who wrote Objective C, have jumped to Swift.

Poor souls? Objective-C jobs pay very well actually.

"Well, I'm familiar with Node.js and the situation there is bordering on silly. Packages are very unstable and constantly being rev'ed. Keeping up and staying on latest is a constant battle almost every day."

Why would anyone want to keep Node.js and all NPM packages up to date in a project almost every day? Maybe every few months at most, unless there are security issues reported in a package and you are required to install a newer version of it. If a JavaScript project is stable and working then there is not much to be gained from constant updates.

Poor souls? Objective-C jobs pay very well actually.

There are well paid developers still writing COBOL or working with mainframes (I know one of these). They are well paid but a job can be well paid and still be a bit rubbish.

Why would anyone want to keep Node.js and all NPM packages up to date in a project almost every day? Maybe every few months at most, unless there are security issues reported in a package and you are required to install a newer version of it. If a JavaScript project is stable and working then there is not much to be gained from constant updates.

Security vulnerabilities are common on NPM, probably due to the shear number of packages involved. New features, better performance, faster...stronger...longer, there are a lot of reasons to be upgrading more then every few months. Your mileage may vary.

RehanSaeed

Roger Roger commented on 2019-02-19 04:29:03

I think its overly complex. Just making a simple input form post has turned into a weekend project of frustration, all their tutorials assume you want to use the entity framework and other related Microsoft APIs, any deviation from their 50 page tutorial (Spread out over multiple webpages) results in banging your head against a wall.

In the end you're left with a simple page that can list and submit records. ::slow clap::

From an outsiders perspective, it seems like a great unintuitive mess.

The simple act of binding client/server data requires so much fuss and hand holding at every step, segmenting a simple page into different elements is a huge pain in the ass if you want to do anything beyond just showing basic data, their automated naming structure system boggles the mind (Why would you place logic based on filenames in 2019?), security seems to be off by default on everything (God forbid you forget an attribute somewhere), the API seems to be moving so fast that tutorials made just last year is already out of date (Do I use partial views or view components? If I use a view component to post data I have to implement the receiving function in the view and not the component? Then what is the point in compartmentalizing it?).

If adaptation rate seems slow, I think it might be because it just seems like a huge mess.

Productivity is king. At least from my perspective; asp.net core does not garner productivity.

Which is a shame, because I do love the C# language and Visual Studio.

RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2019-02-19 09:16:37

I think its overly complex. Just making a simple input form post has turned into a weekend project of frustration, all their tutorials assume you want to use the entity framework and other related Microsoft APIs, any deviation from their 50 page tutorial (Spread out over multiple webpages) results in banging your head against a wall.

In the end you're left with a simple page that can list and submit records. ::slow clap::

From an outsiders perspective, it seems like a great unintuitive mess.

The simple act of binding client/server data requires so much fuss and hand holding at every step, segmenting a simple page into different elements is a huge pain in the ass if you want to do anything beyond just showing basic data, their automated naming structure system boggles the mind (Why would you place logic based on filenames in 2019?), security seems to be off by default on everything (God forbid you forget an attribute somewhere), the API seems to be moving so fast that tutorials made just last year is already out of date (Do I use partial views or view components? If I use a view component to post data I have to implement the receiving function in the view and not the component? Then what is the point in compartmentalizing it?).

If adaptation rate seems slow, I think it might be because it just seems like a huge mess.

Productivity is king. At least from my perspective; asp.net core does not garner productivity.

Which is a shame, because I do love the C# language and Visual Studio.

A lot of what you said resonates. Productivity in general has gone down. Learning all this stuff took me considerable time. Unfortunately, the web is complex and that complexity is only growing at a fairly rapid rate. Still, it keeps us in a job! Some docs do show the use of EF Core but I'll forgive them that. I think Microsoft has really upped it's game with the docs. We now have some of the best docs in the industry.

Sounds like most of the trouble you are having is with server side rendering of HTML i.e. Razor pages or MVC views. I personally don't use that stuff and only use ASP.NET Core for API's. The industry has moved on to SPA's or even server rendered SPA's like Nuxt.js (based on Vue.js which I recommend) or Next.js (based on React.js).

As for security, ASP.NET Core is way more secure than it used to be but security is an ever lasting cat and mouse game, so this is always going to be a complex moving target.

As for adoption rate, take a look at the StackOverflow developer survey, adoption is growing very quickly and it's a much loved framework that people enjoy.

RehanSaeed

Luca Gabi Luca Gabi commented on 2019-03-02 19:44:54

Hi, I have a question if I may: how come Asp Net Core has no projects to speed up development, is it to young, maybe ?

For example PHP has a number of such projects that generate CRUD from a defined model and also have ready made user and roles management fetures and code modules:
https://laravelvoyager.com/
https://pyrocms.com/

This is a reason for many to chose PHP Laravel (blade viewengine) framework over Asp Net Core MVC (razor viewengine).

RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2019-03-02 20:37:36

Hi, I have a question if I may: how come Asp Net Core has no projects to speed up development, is it to young, maybe ?

For example PHP has a number of such projects that generate CRUD from a defined model and also have ready made user and roles management fetures and code modules:
https://laravelvoyager.com/
https://pyrocms.com/

This is a reason for many to chose PHP Laravel (blade viewengine) framework over Asp Net Core MVC (razor viewengine).

There are quite a few project templates available (I even author some called Dotnet Boxed). If you use Visual Studio, you can use the built in scaffolding to generate Controllers and action methods that do CRUD around some given model. Regarding role management, unclear what you're asking since I'm not familiar with Laravel but it's pretty trivial to setup roles and auth. Also we have a world class open source product in IdentityServer4 for OAuth and Open ID Connect.

It is still a fairly young project. It does take time for third party open source projects which boost productivity to spring up but it's happening slowly and surely.

RehanSaeed

Trung Tran Trung Tran commented on 2019-03-03 11:44:46

What a great post! I have solved many of my confusions before. Many thanks.
.NET Core is an amazing thing I think, but there are too many things to learn nowadays so that will be a headache :)
Btw, can you advise me some learning paths as a .NET Core Backend Dev.
I'm trying the following things:

  • Web Api
  • Security
    I'm a bit hesitant about the next steps: Dockers or something ...
    Love hearing your advices!
RehanSaeed

Muhammad Rehan Saeed Muhammad Rehan Saeed commented on 2019-03-03 12:13:27

What a great post! I have solved many of my confusions before. Many thanks.
.NET Core is an amazing thing I think, but there are too many things to learn nowadays so that will be a headache :)
Btw, can you advise me some learning paths as a .NET Core Backend Dev.
I'm trying the following things:

  • Web Api
  • Security
    I'm a bit hesitant about the next steps: Dockers or something ...
    Love hearing your advices!

Sign up for a PluralSight account and/or read every page of the ASP.NET Core docs because they are really great. Docker is now the best way to deploy an API or website, so definitely also worth learning.

RehanSaeed

Trung Tran Trung Tran commented on 2019-03-04 09:35:14

Sign up for a PluralSight account and/or read every page of the ASP.NET Core docs because they are really great. Docker is now the best way to deploy an API or website, so definitely also worth learning.

Thanks. I will try soon.