The web has been going ballistic over a proposed ASP.NET Core change.
Exhibit A : https://github.com/aspnet/Home/issues/2022
ASP.NET Core was now going to run solely on…. .NET Core. Sounds confusing? Keep reading.
It’s been interesting to read reaction on message boards such as Reddit and HN. Mostly because people take the opportunity to lay the smack down on Microsoft without full understanding the situation. Certainly if you don’t use .NET Core on a daily basis, it just looks like Microsoft doing whatever it wants developers be damned.
But here’s the thing. I actually agree with Microsoft on this one to a certain degree. And I actually think their eventual decision to not press forward with the changes could actually hurt ASP.NET Core in the long run. This post is a bit of a riff off a Reddit comment I also made so it may be a bit over the place.
Let me explain.
There is currently 3 (main) ways to write a web application in the .NET ecosystem
- ASP.NET Core
- ASP.NET Full Framework
- ASP.NET Core running on Full Framework
That last one is probably the eye brow raiser and the one that sounds the most “cobbled together”. And it’s actually the one that everyone is fighting over.
You see you can actually run ASP.NET Core on the full framework. You get all the benefits that the ASP.NET Core team gives you (Kestrel etc), but you still have the ability to use full framework libraries. Sounds like a win win right? Kinda.
The reason this works is because ASP.NET Core is written against .NET Standard. That means any classes/methods it calls will also be available in full framework. But it also limits the ability for ASP.NET Core to innovate. They are restricting their own platform to keep the ability of running on the full framework.
So how does the .NET standard work? There is another article on this site talking about the standard in general over here, but I’ll do my best to explain it in the context of the ASP.NET Core 2.0 debacle.
.NET Standard is essentially an agreement between the various .NET platforms (UWP, .NET Full Framework, .NET Core, Mono etc), that they will all implement the same functionality. Think of it like an interface where a class can write an implementation of a method however they like, but the important thing is that they implement it in the first place. The issue with the standard as it is today is that everyone has to move together. If the .NET Core team says “OK, we would like this new thing in the standard please”, they have to wait for agreement from another platform to put it into the standard and implement on their end too (Usually this is going to be from the full framework team).
The problem that the ASP.NET Core team is facing right now is that they have almost zero baggage and can move at an extreme pace. They are able to innovate and throw things into their platform as fast as a developer can code really. That’s why people are using ASP.NET Core running on full framework, because they are enjoying the performance improvements that ASP.NET Core offers. But for them to keep improving AND for ASP.NET Core to keep supporting the ability to run on full framework, they need the full framework to add things almost as fast so that new versions of the .NET Standard can be released.
That’s not happening.
And what that means is that if ASP.NET Core writes a new feature that utilizes something that is NOT in the .NET Standard at that point, they cannot actually release it until the .NET Framework catches up. The ASP.NET Core team has basically said that for them to keep moving at the same pace, they are going to have to make their libraries work on .NET Core only so that their only limitation to releasing new features is their own ability to write them.
To me that’s understandable. They probably need some sort of pathway for those that have been caught in the middle of this hybrid approach. But we can’t have a web framework that everyone loves for it’s ability to innovate be tied down by a legacy frameworks ability to do the same.
Microsoft has backtracked and said that they will continue supporting ASP.NET Core running on the full .NET Framework. I think it will be interesting a year from now to see how this pans out. Giving something like another years support seems look a good plan, but I don’t like the open ended support “we will see in a year” type approach.
What’s your thoughts?