ASP.NET Core Download: Complete Guide to Getting Started with the Framework
Learn how to perform an ASP.NET Core download, install the .NET SDK, and build your first web app. Step-by-step guide for developers in 2026 June.

The ASP.NET Core download is your first step toward building modern, cross-platform web applications with one of the most powerful frameworks in the .NET ecosystem. Whether you are setting up a development workstation for the first time or migrating an existing project from the classic ASP.NET Framework, knowing exactly what to download, which version to choose, and how to configure your environment is essential.
Microsoft releases new versions of ASP.NET Core on a predictable schedule, so understanding the landscape helps you pick the right installer for your use case. Before diving into setup details, it is also worth reviewing asp.net core download security advisories to ensure your chosen version is not affected by known exploits.
ASP.NET Core ships as part of the broader .NET platform, which means the installer you download bundles the runtime, the SDK, and several supporting libraries in a single package. For most developers, the recommended download is the .NET SDK, because it includes everything needed to build, test, and run applications. The SDK installer is available for Windows, macOS, and Linux, making ASP.NET Core a genuinely cross-platform choice. When Microsoft publishes a new release, it typically offers three files: the SDK installer, the runtime-only installer, and the hosting bundle designed for production servers running Internet Information Services on Windows.
Choosing the correct installer variant matters more than many newcomers realize. The SDK is the right choice for developer machines, as it includes compilers, the dotnet CLI tool, and project templates that let you scaffold a new ASP.NET Core application in seconds. The runtime-only package is designed for deployment targets where you need to run pre-compiled applications but do not need the build toolchain. The ASP.NET Core Runtime package is a subset of the full .NET Runtime and includes the web-specific libraries, such as Kestrel, Middleware, and MVC, while excluding libraries used only in desktop applications.
Version selection is a critical decision that affects long-term support, security patching, and compatibility with third-party NuGet packages. Microsoft designates releases as either Long Term Support (LTS) or Standard Term Support (STS). LTS versions receive patches and security updates for three years, while STS versions are supported for only eighteen months. For production applications that need stable foundations, LTS releases like .NET 8 (supported until November 2026) are almost always preferable. Greenfield projects starting in 2025 that can tolerate more frequent upgrades may choose .NET 9, which ships performance improvements and new language features.
The official download portal at dotnet.microsoft.com categorizes installers by operating system and CPU architecture, including x64, x86, and Arm64. Arm64 support has become increasingly important as Apple Silicon Macs and Arm-based Windows laptops have grown in popularity.
Downloading the wrong architecture can cause cryptic errors during installation or runtime, so verifying your machine's architecture before downloading is always worth a few seconds. On Windows, running systeminfo | findstr /C:"System Type" in a command prompt will confirm whether your system is x64 or x86. On macOS, clicking About This Mac will tell you whether you have an Intel or Apple Silicon chip.
Beyond the official Microsoft download page, many developers install .NET through package managers. On macOS, Homebrew supports the brew install dotnet command, which fetches the latest SDK automatically. On Ubuntu and Debian Linux, Microsoft maintains its own APT repository so you can run apt-get install dotnet-sdk-8.0 directly. Package manager installations make it easier to manage multiple .NET versions on a single machine and to automate environment setup in Docker containers or CI/CD pipelines. Winget, Microsoft's package manager for Windows, also supports .NET installation with winget install Microsoft.DotNet.SDK.8.
Once your ASP.NET Core download completes and the SDK installs successfully, you can verify the installation by opening a terminal and running dotnet --version. If the command returns a version number like 8.0.100, your environment is ready. Running dotnet new list will display all available project templates, including those for web APIs, MVC applications, Razor Pages, Blazor Server, and Blazor WebAssembly. The variety of templates reflects how broadly ASP.NET Core has expanded beyond traditional server-rendered pages to support real-time applications, single-page app back-ends, gRPC services, and minimal API endpoints.
ASP.NET Core by the Numbers

How to Download and Install ASP.NET Core
Visit the Official .NET Download Page
Select the Right Installer Variant
Verify Your CPU Architecture
Run the Installer or Package Manager Command
Verify the Installation
Create and Run a Test Application
Installing ASP.NET Core is straightforward on all three major operating systems, but each platform has nuances that can trip up first-time developers. On Windows, the installer wizard walks you through a standard setup process, modifying the PATH environment variable automatically so the dotnet command is accessible from any command prompt or PowerShell window immediately after installation.
Windows developers should note that if Visual Studio is already installed, it ships with its own copy of the .NET SDK, but that version may lag behind the latest release. Running both a standalone SDK and a Visual Studio-managed SDK on the same machine is fully supported, and the CLI will respect the global.json file to select the correct version for each project.
On macOS, Homebrew is the most popular installation path for developers who prefer the command line. Running brew install dotnet@8 installs .NET 8 specifically, while brew install dotnet fetches the latest stable release. One important macOS-specific consideration is that Homebrew does not automatically add the dotnet executable to your shell PATH. After installation, you need to add an export line to your ~/.zshrc or ~/.bash_profile file pointing to the Homebrew Cellar directory where .NET was installed. The Homebrew installer output usually prints the exact export statement you need to copy.
Linux installation is most reliable when using Microsoft's official package repositories rather than the default distribution repositories, which sometimes carry outdated versions of .NET. For Ubuntu users, Microsoft provides a setup script that adds its APT feed, after which sudo apt-get install -y dotnet-sdk-8.0 works cleanly. On Red Hat Enterprise Linux or CentOS Stream, the equivalent is sudo dnf install dotnet-sdk-8.0 after adding the Microsoft RPM repository. Container-based development on Linux is particularly smooth because Microsoft publishes official .NET Docker images on Docker Hub, so spinning up a containerized build environment requires only a one-line Dockerfile FROM statement.
Side-by-side installation of multiple .NET versions is one of the framework's most developer-friendly features. Unlike Node.js where nvm is a separate tool, .NET supports multiple SDK versions natively. Running dotnet --list-sdks shows every installed SDK, and running dotnet --list-runtimes shows every runtime. When you open a project that has a global.json file specifying a sdk.version field, the CLI automatically uses that exact version, making it easy to maintain legacy projects pinned to older SDK releases while also working on new projects that use the latest SDK.
The global.json file is a small but powerful configuration file that belongs at the solution root or repository root. Its structure is minimal — a JSON object with a single sdk section containing a version string and an optional rollForward policy. The rollForward policy controls how the SDK resolves version mismatches.
Setting it to latestMinor allows the CLI to use the newest installed SDK within the same major version, while disable requires an exact match and fails with an error if that exact version is not installed. Teams working across multiple machines benefit from committing global.json to version control to ensure all developers and CI runners use the same SDK version.
Environment management is especially important when deploying ASP.NET Core applications to shared Linux servers where multiple applications may require different .NET versions. In this scenario, using the full path to the runtime binary in systemd service files rather than relying on PATH ensures each application starts with the correct runtime. Microsoft also provides the dotnet-install.sh script specifically for CI environments and servers where you want to install a specific .NET version in a user-local directory without requiring root access or a system-wide installation, making it the preferred choice for build agents and containers.
After installing the SDK, many developers immediately install the ASP.NET Core developer certificate for local HTTPS development. Running dotnet dev-certs https --trust generates a self-signed certificate and adds it to the operating system's trust store, eliminating browser security warnings when running applications locally on HTTPS.
This step is particularly important for applications that use authentication flows, cookies with Secure flags, or HTTP Strict Transport Security headers, all of which behave incorrectly over plain HTTP. On Linux, where there is no system-wide trust store in the same sense as Windows and macOS, developers typically use a browser extension or configure the certificate manually in Firefox or Chrome.
ASP.NET Core SDK vs Runtime vs Hosting Bundle
The .NET SDK is the complete developer package and includes the runtime, the ASP.NET Core runtime, the compilers, the dotnet CLI, and all standard project templates. It is the correct download for any machine where you will write code, run tests, or build projects. The SDK installer is roughly 200-250 MB and installs in under two minutes on most modern systems with a fast internet connection.
When you install the SDK, you automatically get a matching runtime for the same version. However, you can also install additional runtimes alongside a single SDK. For example, installing the .NET 8 SDK gives you the .NET 8 runtime, but you can separately install the .NET 6 and .NET 7 runtimes so your single SDK installation can run applications targeting older framework versions. This arrangement is common on CI build servers that must handle a heterogeneous portfolio of applications.

ASP.NET Core: Advantages and Limitations
- +True cross-platform support runs identically on Windows, macOS, and Linux without code changes
- +Exceptional raw performance consistently ranks among the fastest web frameworks in TechEmpower benchmarks
- +Unified framework merges MVC, Web API, Razor Pages, SignalR, and gRPC into one cohesive platform
- +Native dependency injection container reduces boilerplate and encourages loosely coupled architecture
- +Docker and Kubernetes support is first-class with official Microsoft-published container images
- +Minimal API surface in .NET 6+ lets you build lightweight services with a fraction of the code of full MVC
- −Steeper learning curve than frameworks like Express.js or Laravel for developers new to strongly typed languages
- −Rapidly evolving API surface means code written for .NET 5 may require updates to compile on .NET 8
- −Windows-specific features like Windows Authentication and IIS tight integration do not translate to Linux deployments
- −Blazor WebAssembly initial payload size can be 5-10 MB, causing slow first-load times on mobile connections
- −Side-by-side versioning can confuse developers who accidentally run projects against the wrong SDK version
- −Third-party library ecosystem, while large, is smaller than JavaScript's npm ecosystem for some niche use cases
ASP.NET Core Download and Setup Verification Checklist
- ✓Download the .NET SDK (not runtime-only) from the official dotnet.microsoft.com/download page.
- ✓Confirm you selected the correct CPU architecture (x64, x86, or Arm64) before downloading.
- ✓Choose an LTS version such as .NET 8 for production projects requiring multi-year support.
- ✓Run dotnet --version in a fresh terminal to confirm the SDK installed and PATH is set correctly.
- ✓Run dotnet --list-sdks to confirm no conflicting SDK versions are installed unexpectedly.
- ✓Run dotnet dev-certs https --trust to install the local HTTPS development certificate.
- ✓Create a test project with dotnet new webapi -n TestApp and confirm it builds without errors.
- ✓Run dotnet run inside the test project and verify the API responds in the browser or curl.
- ✓Check for a global.json file in your repository and confirm the specified version is installed.
- ✓Install recommended IDE extensions (C# Dev Kit for VS Code or Rider .NET plugin) for IntelliSense support.
Always Choose LTS for Production Workloads
Microsoft's Long Term Support releases (.NET 6, .NET 8, .NET 10) receive security patches and bug fixes for three full years. Standard Term Support releases like .NET 7 and .NET 9 go end-of-life after just eighteen months. For any application running in production, selecting an LTS version avoids forced mid-cycle upgrades that can disrupt development timelines and introduce unexpected breaking changes during critical business periods.
Managing multiple .NET versions on a single development machine is a scenario every professional ASP.NET Core developer eventually faces. You might maintain a legacy enterprise application targeting .NET 6 while simultaneously working on a new microservice built on .NET 8 and experimenting with preview features in .NET 10. The .NET SDK handles this elegantly through its global versioning system and the global.json file. Understanding how version resolution works prevents the most common class of environment-related bugs, where an application compiles and runs perfectly on one developer's machine but fails on another's because of a version mismatch.
The dotnet CLI uses a roll-forward algorithm when the exact SDK version specified in global.json is not installed. By default, if you specify 8.0.100 but only 8.0.300 is installed, the CLI rolls forward to the latest patch within the same minor version. This behavior is controllable via the rollForward field in global.json.
Setting it to latestFeature allows rolling forward to any feature band within the same major.minor, while major allows rolling across major versions entirely. Teams with strict reproducibility requirements should set rollForward to disable and pin exact versions in CI, ensuring builds are identical regardless of which SDK version a developer has locally installed.
The dotnet-install script is an invaluable tool for CI/CD pipelines and server automation. Available in both a bash version for Linux and macOS and a PowerShell version for Windows, it accepts a --version parameter to install any specific .NET SDK or runtime version into a directory of your choice without requiring administrator privileges.
GitHub Actions, Azure Pipelines, and other CI platforms offer dedicated setup-dotnet tasks that wrap this script, making it trivial to pin a workflow to a specific SDK version with a single YAML configuration line. This approach ensures every CI build runs against the same tools regardless of what the hosted runner has pre-installed.
Docker-based development is increasingly popular for ASP.NET Core projects because it eliminates the entire category of machine-specific environment problems. Microsoft's official .NET Docker images on Docker Hub follow a consistent tagging scheme: mcr.microsoft.com/dotnet/sdk:8.0 for the full SDK and mcr.microsoft.com/dotnet/aspnet:8.0 for the runtime-only image. Multi-stage Dockerfiles that use the SDK image for building and the runtime image for the final artifact are the recommended pattern, producing small production images typically under 200 MB while still using the full SDK during the compile stage. The dotnet new webapi template includes a sample Dockerfile implementing this pattern out of the box.
Windows Subsystem for Linux (WSL2) has changed the development experience for Windows-based .NET developers significantly. Running ASP.NET Core applications inside WSL2 means they execute in a genuine Linux environment, making it much easier to catch Linux-specific issues like case-sensitive file paths and Unix line endings before deploying to a Linux production server.
Visual Studio and VS Code both support remote development against WSL2 instances, and the dotnet CLI inside WSL2 is entirely independent from any .NET installation on the Windows host, preventing version conflicts between the two environments. Many teams now standardize on WSL2 for all back-end development to maximize parity with production Linux containers.
NuGet package restoration is closely tied to the installed SDK version. When you run dotnet restore, the CLI resolves package versions according to the project's target framework moniker (TFM), such as net8.0. Packages published to NuGet.org declare which TFMs they support, and the restore step will fail if a package does not support your project's target framework.
This is a common issue when upgrading a project from an older .NET version: some packages may not yet have a release targeting the new TFM, requiring you to either use compatibility mode, wait for the package author to publish an updated version, or find an alternative library. Checking package compatibility before committing to an upgrade saves substantial debugging time later.
Self-contained deployments are an advanced but valuable deployment model where the .NET runtime is bundled directly into the application's published output, eliminating any dependency on the runtime being installed on the target machine. Publishing a self-contained application requires specifying the target runtime identifier (RID), such as win-x64, linux-x64, or osx-arm64, in the publish command.
The resulting folder contains the application binaries, all NuGet dependencies, and the full .NET runtime, making the deployment fully portable. The trade-off is size — a self-contained publish can be 50-100 MB larger than a framework-dependent deploy. Single-file publish mode, available since .NET 5, compresses this into a single executable at the cost of slightly slower cold-start times on first launch.

Running ASP.NET Core applications on an end-of-life .NET version means your application will not receive security updates, even for critical vulnerabilities. .NET 5, .NET 7, and .NET Core 2.x are all end-of-life as of 2025. Applications still targeting these versions should be prioritized for upgrade. Check the official .NET and .NET Core Support Policy page for current end-of-life dates before making version decisions for new projects or production deployments.
Building your first ASP.NET Core application after completing the download and installation is a satisfying milestone that validates your environment and introduces you to the framework's core concepts simultaneously. The quickest path is the minimal API template, introduced in .NET 6, which condenses a fully functional HTTP API into as few as five lines of code.
Running dotnet new web -n HelloWorld generates a project with a single Program.cs file containing a MapGet call that returns a Hello World string. This contrasts sharply with the traditional MVC template, which scaffolds controllers, views, models, and a startup class hierarchy that can overwhelm developers new to the framework.
The ASP.NET Core request pipeline is the central concept every developer must understand regardless of which project template they start with. The pipeline is a sequence of middleware components, each of which can inspect an incoming HTTP request, modify it, pass it to the next component, and then process the outgoing response on the way back out.
Middleware is added in Program.cs using extension methods like app.UseRouting(), app.UseAuthentication(), and app.UseAuthorization(). The order in which middleware is added matters critically — authentication middleware must be added before authorization middleware, and routing middleware must run before endpoint-matching middleware, or requests will not be handled correctly.
Dependency injection is built into ASP.NET Core at the framework level, not bolted on as an afterthought. The IServiceCollection interface in Program.cs is where you register all your application's services before the application starts.
Services are registered with one of three lifetime scopes: Singleton (one instance for the entire application lifetime), Scoped (one instance per HTTP request), or Transient (a new instance every time it is requested). Choosing the wrong lifetime scope is a common source of subtle bugs — injecting a Scoped service into a Singleton service, for example, creates a captured dependency that causes the Scoped service to behave as a Singleton, potentially sharing state across requests in a way that causes data leaks or race conditions.
ASP.NET Core's configuration system is flexible enough to handle simple key-value pairs from appsettings.json files as well as complex hierarchical configuration from environment variables, Azure Key Vault, AWS Parameter Store, or custom providers. The IConfiguration interface provides a unified API regardless of where configuration values come from, and the options pattern — binding configuration sections to strongly typed classes via services.Configure<MyOptions>(config.GetSection("MySection")) — is the recommended approach for any configuration block with more than a couple of fields.
The environment-specific override system, where appsettings.Production.json overrides appsettings.json in production, makes it easy to maintain separate configuration profiles for development, staging, and production without duplicating entire configuration files.
Routing in ASP.NET Core has evolved significantly across framework versions. In .NET 5 and earlier, attribute routing on controllers was the primary mechanism. In .NET 6 and later, minimal APIs introduced a more functional routing style using app.MapGet, app.MapPost, and related methods directly in Program.cs.
Both styles coexist in the same application, so you can use minimal APIs for simple, high-performance endpoints while using full controller-based routing for complex domains with extensive validation, action filters, and model binding requirements. Route constraints, route groups, and endpoint filters added in .NET 7 make minimal APIs increasingly powerful for scenarios that previously required full controllers.
Testing is an integral part of the ASP.NET Core development workflow. The framework ships with the WebApplicationFactory<T> class in the Microsoft.AspNetCore.Mvc.Testing NuGet package, which spins up an in-memory test server that processes HTTP requests through the full middleware pipeline without binding to a real network port.
This approach enables integration tests that validate routing, middleware behavior, authentication, and database interactions together without needing a running server or deployed environment. Combining WebApplicationFactory with xUnit and Testcontainers (for spinning up real databases in Docker) gives you a test suite that provides very high confidence in the correctness of your application's behavior across the full request lifecycle.
Hot reload is a productivity feature available since .NET 6 that applies code changes to a running application without a full restart. Running dotnet watch run instead of dotnet run activates hot reload. When you save a C# file, the framework attempts to apply the delta immediately, and in many cases the browser reflects the change within a second or two.
Hot reload supports changes to method bodies, property implementations, and Razor markup, though changes to class hierarchies, interface definitions, and middleware registration require a full restart. For Razor Pages and MVC views, hot reload dramatically accelerates the UI iteration loop, as you can see layout and style changes reflected immediately without navigating away from the page you are working on.
Keeping your ASP.NET Core installation up to date is not just a best practice — it is a security necessity. Microsoft issues cumulative patch releases for each supported .NET version on a regular schedule, typically monthly. These patch releases are numbered as third-segment increments, so .NET 8.0.1, 8.0.2, and so on each contain bug fixes and security patches.
Unlike major or minor version upgrades, patch updates are designed to be drop-in replacements that require no code changes. Installing the latest patch release is always recommended for any production system, and most hosting providers apply runtime patches to their managed environments automatically within days of Microsoft's release.
The .NET Upgrade Assistant is a command-line tool and Visual Studio extension that helps automate the process of upgrading existing ASP.NET Framework applications to modern ASP.NET Core. It analyzes your project, identifies incompatible APIs, and in many cases makes automatic code transformations to replace deprecated patterns with their ASP.NET Core equivalents.
The assistant handles common migration tasks like converting HttpContext.Current usage, updating web.config settings to appsettings.json, and replacing System.Web namespaces with their Microsoft.AspNetCore counterparts. While it does not perform a fully automated migration of complex applications, it dramatically reduces the manual effort required and provides a clear assessment of migration complexity before you commit resources to the project.
Performance tuning is a common post-installation concern for teams running ASP.NET Core in high-traffic production environments. The framework exposes several configuration knobs that can dramatically affect throughput.
The Kestrel web server, which is the default server for ASP.NET Core and the primary server for Linux deployments, allows you to configure maximum concurrent connections, request body size limits, keep-alive timeout intervals, and the number of I/O threads via the ConfigureKestrel method in Program.cs. For most applications, the defaults are appropriate, but high-throughput APIs serving thousands of requests per second benefit from tuning these settings based on load testing data rather than guesswork.
Response caching and output caching are built-in performance features that reduce server load for endpoints serving relatively static content. The ResponseCachingMiddleware adds standard HTTP cache headers to responses, enabling CDNs and browser caches to serve cached copies. The newer OutputCacheMiddleware, introduced in .NET 7, maintains a server-side cache with more fine-grained control, including the ability to tag cached entries and invalidate specific entries programmatically. Combining output caching with a CDN like Azure Front Door or Cloudflare in front of your ASP.NET Core application can reduce origin server traffic by 80-90% for content-heavy applications, significantly reducing infrastructure costs at scale.
Health check endpoints are another important operational feature included in the framework. Adding services.AddHealthChecks() and app.MapHealthChecks("/health") creates a lightweight HTTP endpoint that returns a 200 OK response when the application is healthy and a 503 Service Unavailable when it is not. Health checks can include custom logic to verify database connectivity, dependent service availability, and disk space, giving load balancers and container orchestration systems like Kubernetes the signal they need to route traffic away from unhealthy instances. The Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore package provides a ready-made health check that verifies your Entity Framework Core database connection is responsive.
Structured logging with Serilog or Microsoft.Extensions.Logging is a critical operational practice for ASP.NET Core applications. The framework's built-in logging abstractions use a provider model where the actual log destination — console, file, Application Insights, Elasticsearch, or elsewhere — is configured at startup without changing application code.
Structured logging, where log messages include typed key-value pairs rather than just formatted strings, makes it much easier to search and filter logs in tools like Kibana, Grafana Loki, or Azure Monitor. Adding correlation IDs to all log entries, using the built-in ILogger<T> interface with scopes, lets you trace the full journey of a single HTTP request across all log entries it generates, which is invaluable for debugging production issues in distributed systems.
Security headers are a simple but often overlooked aspect of ASP.NET Core deployment. The NWebsec middleware library or custom middleware can add HTTP security headers like Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, and Permissions-Policy to every response. These headers instruct browsers to enforce security policies that protect users from cross-site scripting, clickjacking, and other client-side attacks.
Adding a comprehensive set of security headers to your ASP.NET Core application is a low-effort way to score well on security scanner tools like Mozilla Observatory or Qualys SSL Labs, which many enterprise customers and compliance frameworks require. The OWASP Secure Headers Project publishes recommended values for each header based on current threat intelligence.
Asp Net Core Questions and Answers
About the Author
Educational Psychologist & Academic Test Preparation Expert
Columbia University Teachers CollegeDr. Lisa Patel holds a Doctorate in Education from Columbia University Teachers College and has spent 17 years researching standardized test design and academic assessment. She has developed preparation programs for SAT, ACT, GRE, LSAT, UCAT, and numerous professional licensing exams, helping students of all backgrounds achieve their target scores.




