.NET
Software Mile builds on .NET – Microsoft’s modern, cross-platform framework and the natural choice for organizations invested in the Microsoft stack or building high-performance services in C#.
Modern .NET, Cross-Platform
- ASP.NET Core web applications and APIs, running on Windows or Linux
- C# services with the performance and tooling the modern .NET platform brings
- Integration with Azure, SQL Server, and the Microsoft ecosystem
- Migration of legacy .NET Framework applications to modern .NET
.NET is a strong, fast, well-tooled platform – especially in a Microsoft shop. Tell us what you are building.
A .NET Framework Migration Is Decided by the Dependencies
Class libraries, data access and business logic usually port to modern .NET with limited change. What decides the size of the job is everything else the application touches, which is why the dependency inventory comes before anyone quotes. Presentation layers and platform-specific integrations are where a migration turns into a rebuild, and an honest assessment names those first.
Sometimes the inventory concludes that migration is not worth doing yet. An internal application with a small user base and no pending change requests can be left where it is, on a supported operating system and in a controlled network position, until there is a business reason to move it. Four things usually decide which case you are in:
- Web Forms, which has no direct equivalent, so the presentation layer is rewritten rather than ported.
- Server-side WCF, which needs a move to REST or gRPC, or a port to CoreWCF where the contract has to stay as it is.
- Windows-specific APIs and COM interop, which constrain where the result can run.
- Third-party components with no modern .NET release, which need replacing.
Does Modern .NET Mean You Have to Leave Windows?
No. Cross-platform is a capability, not an obligation, and Windows hosting stays reasonable when you have directory integration, established IIS operations, or an operations team built around it. The gain from Linux containers is mostly hosting density, licensing and fitting into an orchestration platform you already run.
This decision belongs to whoever operates the system as much as to whoever writes it. If your operations team runs Windows and has no Linux experience, moving the runtime hands them a platform they cannot troubleshoot under pressure, and the hosting economics have to be worth quite a lot before that trade makes sense.
Blazor, Razor Pages, or a JavaScript Front End?
Blazor lets a C# team build interactive interfaces without a separate JavaScript stack, which is valuable when that team is who you have. The server-hosted model keeps the download small but needs a persistent connection and is sensitive to latency. The WebAssembly model tolerates intermittent connectivity at the cost of a larger initial download.
Razor Pages and MVC remain the simplest answer for applications that are mainly forms and records, and being unfashionable is not an argument against them. A React or Angular front end against an ASP.NET Core API keeps the boundary explicit and the two hiring pools separate, at the cost of running two stacks.
Are You Choosing .NET, or Are You Choosing Azure?
These are separate decisions that often get made as one. Modern .NET runs on Linux, in containers, on the major cloud platforms and on hardware you own. Azure is a convenience if you are already there, since identity, hosting, managed databases, secrets and telemetry are integrated and reduce how much you have to assemble.
If your infrastructure sits elsewhere, that is neither a reason to avoid .NET nor a reason to move. Treat a platform migration as its own project with its own justification. Folding it into a runtime upgrade is how two manageable pieces of work become one that nobody can estimate.
Where .NET Projects Accumulate Work After Launch
The parts of a .NET project that get attention during a build are the features. The parts that cause trouble two years later are the mechanics around them: schema changes moved between environments by hand, configuration that varies per environment in ways nobody wrote down, and secrets living wherever they were first convenient.
None of that is hard to get right at the start, and all of it is tedious to unpick once the application is in production and a second team is contributing. Four decisions are worth making before the first release:
- A target framework version for new work, so the estate does not drift into four runtimes at once.
- Schema changes applied by a migration that runs as part of the deploy.
- Configuration declared per environment, with the differences visible in one place.
- Secrets held in a store the application reads at startup, and nowhere else.