← Back to Articles         
Can Angular static files be hosted by ASP.NET Core?

Can Angular static files be hosted by ASP.NET Core?

Published on 02 Oct 2026     8 min read Angular
Deployment

Can Angular static files be hosted by ASP.NET Core?

Yes. ASP.NET Core can host the static files generated by an Angular production build.

In this approach, Angular and ASP.NET Core are deployed as one application:

Browser
   ↓
ASP.NET Core Application
   ├── Angular static files
   │     ├── index.html
   │     ├── main-*.js
   │     ├── styles-*.css
   │     └── chunk-*.js
   │
   └── Web API
         ↓
      SQL Server

This is different from deploying Angular and ASP.NET Core separately.


1. What are Angular static files?

When you run:

ng build --configuration production

Angular compiles the application and generates browser-deployable files under dist.

For a modern Angular application, you might see:

dist/
└── my-angular-app/
    └── browser/
        ├── index.html
        ├── main-ABC123.js
        ├── styles-XYZ456.css
        ├── chunk-DEF789.js
        └── ...

These are primarily static files.

They don't require Angular CLI or Node.js to execute in the user's browser after they have been built.

The web server simply needs to serve them.


2. How can ASP.NET Core host them?

ASP.NET Core has built-in static file support.

The normal static file directory is:

wwwroot/

Therefore, Angular's generated browser files can be placed inside the ASP.NET Core application's wwwroot.

For example:

MyApplication/
│
├── Controllers/
│   └── ProductsController.cs
│
├── wwwroot/
│   ├── index.html
│   ├── main-ABC123.js
│   ├── styles-XYZ456.css
│   ├── chunk-DEF789.js
│   └── assets/
│
├── Program.cs
└── MyApplication.csproj

ASP.NET Core can then serve both:

Angular UI       → /
ASP.NET Core API → /api/...

3. Full Simple Sample

Let's create a simple architecture:

Angular
   ↓
ASP.NET Core Web API
   ↓
Products

Angular will be hosted from ASP.NET Core's wwwroot.


Step 1 — Angular component

products.ts

import { Component, inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';

interface Product {
  id: number;
  name: string;
  price: number;
}

@Component({
  selector: 'app-products',
  standalone: true,
  template: `
    <h1>Products</h1>

    @for (product of products; track product.id) {
      <p>
        {{ product.name }} - {{ product.price }}
      </p>
    }
  `
})
export class Products {

  private http = inject(HttpClient);

  products: Product[] = [];

  ngOnInit() {
    this.http
      .get<Product[]>('/api/products')
      .subscribe(data => {
        this.products = data;
      });
  }
}

Notice the API URL:

'/api/products'

We don't need:

'https://localhost:7001/api/products'

because Angular and ASP.NET Core can use the same origin.


4. ASP.NET Core API

ProductsController.cs

using Microsoft.AspNetCore.Mvc;

namespace MyApplication.Controllers;

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        var products = new[]
        {
            new
            {
                Id = 1,
                Name = "Laptop",
                Price = 50000
            },
            new
            {
                Id = 2,
                Name = "Mouse",
                Price = 1000
            }
        };

        return Ok(products);
    }
}

The endpoint is:

/api/products

5. Configure ASP.NET Core

Program.cs

A simple configuration is:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();

app.UseDefaultFiles();
app.UseStaticFiles();

app.UseAuthorization();

app.MapControllers();

app.MapFallbackToFile("index.html");

app.Run();

Three important parts are:

app.UseDefaultFiles();
app.UseStaticFiles();

and:

app.MapFallbackToFile("index.html");

6. What does UseStaticFiles() do?

app.UseStaticFiles();

allows ASP.NET Core to serve files from wwwroot.

Suppose:

wwwroot/
├── index.html
├── main-ABC123.js
├── styles-XYZ456.css
└── images/
    └── logo.png

The browser can request:

GET /main-ABC123.js

ASP.NET Core returns:

wwwroot/main-ABC123.js

Similarly:

GET /images/logo.png

returns:

wwwroot/images/logo.png

7. What does UseDefaultFiles() do?

Suppose the user visits:

https://www.example.com/

ASP.NET Core can use a default document such as:

index.html

So conceptually:

GET /
   ↓
UseDefaultFiles()
   ↓
/index.html
   ↓
UseStaticFiles()
   ↓
Angular index.html

8. Why do we need MapFallbackToFile("index.html")?

This is especially important for Angular client-side routing.

Suppose Angular routes are:

import { Routes } from '@angular/router';

export const routes: Routes = [
  {
    path: '',
    loadComponent: () =>
      import('./home').then(m => m.Home)
  },
  {
    path: 'products',
    loadComponent: () =>
      import('./products').then(m => m.Products)
  }
];

The user opens:

https://www.example.com/products

Angular understands:

/products

But ASP.NET Core doesn't have an endpoint such as:

[HttpGet("/products")]

Without fallback handling, refreshing /products could result in a server-side 404.

Therefore:

app.MapFallbackToFile("index.html");

means that an unmatched application route can return:

index.html

Then Angular Router takes over.


9. Angular routing flow

For example:

User enters

https://www.example.com/products

              ↓

        ASP.NET Core

              ↓

No matching controller endpoint
No matching static file

              ↓

MapFallbackToFile("index.html")

              ↓

         index.html

              ↓

      Angular starts

              ↓

      Angular Router

              ↓

       /products

              ↓

    Products Component

This is a very important interview concept.


10. Build Angular

Run:

ng build --configuration production

Suppose the output is:

dist/
└── my-angular-app/
    └── browser/
        ├── index.html
        ├── main-ABC123.js
        ├── styles-XYZ456.css
        └── chunk-DEF789.js

Copy the contents of browser into:

ASP.NET Core/wwwroot/

Result:

MyApplication/
│
├── Controllers/
│
├── wwwroot/
│   ├── index.html
│   ├── main-ABC123.js
│   ├── styles-XYZ456.css
│   └── chunk-DEF789.js
│
└── Program.cs

11. Publish ASP.NET Core

Now publish the ASP.NET Core application:

dotnet publish -c Release

The publish output contains the ASP.NET Core application together with wwwroot.

Conceptually:

publish/
│
├── MyApplication.dll
├── MyApplication.exe
├── appsettings.json
├── web.config
│
└── wwwroot/
    ├── index.html
    ├── main-ABC123.js
    ├── styles-XYZ456.css
    └── chunk-DEF789.js

You can then deploy this application to your server.


12. Complete Production Architecture

                 Browser
                    |
                    | HTTPS
                    ↓
            ASP.NET Core
          www.example.com
             /       \
            /         \
           ↓           ↓
     Angular Files    Web API
       wwwroot/      /api/...
           |           |
           |           ↓
           |       SQL Server
           |
           ↓
     Angular runs
     in browser

13. Request examples

When the browser requests:

GET /

ASP.NET Core serves:

index.html

When the browser requests:

GET /main-ABC123.js

ASP.NET Core serves:

wwwroot/main-ABC123.js

When Angular requests:

GET /api/products

ASP.NET Core executes:

ProductsController

When the browser requests:

GET /products

the fallback serves:

index.html

and Angular Router handles /products.

So:

Request                Handled By
────────────────────────────────────────
/                      Angular
/products              Angular Router
/articles              Angular Router

/main-ABC123.js         Static Files
/styles-XYZ456.css      Static Files
/images/logo.png        Static Files

/api/products           ASP.NET Core
/api/articles           ASP.NET Core
/api/categories         ASP.NET Core

14. Do we need CORS?

If Angular and ASP.NET Core are served from the same origin, CORS generally isn't needed for calls between them.

For example:

Angular
https://www.example.com

API
https://www.example.com/api

Angular:

this.http.get('/api/products');

Browser resolves that to:

https://www.example.com/api/products

Same:

  • scheme: https
  • host: www.example.com
  • port: default HTTPS port

Therefore:

Same Origin
    ↓
No cross-origin request

Compare that with separate deployment:

Angular:
https://www.example.com

API:
https://api.example.com

These are different origins, so browser CORS rules apply.


15. Same server does NOT always mean same origin

This is an important interview point.

Suppose:

Angular:
https://www.example.com

API:
https://www.example.com:5001

Even if they run on the same physical server, they use different ports.

Therefore, they are different origins.

Origin is based on:

Scheme + Host + Port

For example:

https://www.example.com:443
https://www.example.com:5001

are different origins.


16. Combined vs Separate Hosting

Combined

www.example.com
       ↓
 ASP.NET Core
   ↙       ↘
Angular     API
wwwroot    /api

Angular can call:

this.http.get('/api/products');

Separate

www.example.com
      ↓
   Angular
      |
      | HTTPS
      ↓
api.example.com
      ↓
ASP.NET Core

Angular might call:

this.http.get(
  'https://api.example.com/api/products'
);

Advantages of hosting Angular with ASP.NET Core

1. Single deployment

You deploy one application package:

ASP.NET Core
    +
Angular static files

2. Same-origin API calls

Angular can simply use:

'/api/products'

3. Simpler CORS situation

Same-origin frontend/API communication doesn't require cross-origin CORS permission.

4. Convenient for smaller and medium-sized applications

Deployment and infrastructure can be simpler because frontend and backend are released together.


Disadvantages

1. Frontend and backend deployments become more coupled

Changing Angular may require publishing/deploying the combined application package.

2. Independent scaling is less natural

With separate hosting, you can independently scale frontend delivery and backend API infrastructure.

3. CDN/static hosting may be more efficient for Angular

Because Angular browser output is static, dedicated static hosting/CDNs can provide highly efficient global delivery.


Key Points

  1. Yes, ASP.NET Core can host Angular static files.
  2. Build Angular using:
ng build --configuration production
  1. Angular generates deployable browser files under dist.
  2. Those files can be copied to:
ASP.NET Core/wwwroot
  1. Use:
app.UseStaticFiles();

to serve static resources.

  1. For Angular SPA routes, use a fallback such as:
app.MapFallbackToFile("index.html");
  1. Angular can call the API using relative URLs:
'/api/products'
  1. Same-origin hosting generally avoids CORS issues between Angular and ASP.NET Core.
  2. Angular still runs primarily in the user's browser; ASP.NET Core is serving the generated files.
  3. This approach creates a convenient single deployment unit.

Interview Questions and Answers

1. Can ASP.NET Core host Angular static files?

Yes. Angular's production build generates static browser files that can be placed in ASP.NET Core's wwwroot directory and served using static-file middleware.


2. Where do you place Angular build files in ASP.NET Core?

Typically:

wwwroot/

For example:

wwwroot/
├── index.html
├── main-*.js
├── styles-*.css
└── chunk-*.js

3. What does UseStaticFiles() do?

app.UseStaticFiles();

It allows ASP.NET Core to serve static files from wwwroot, including Angular's generated JavaScript, CSS, images, and other assets.


4. Why do we use MapFallbackToFile("index.html")?

It supports Angular client-side routing.

For example:

/products

can fall back to:

index.html

after which Angular Router processes /products.


5. Is CORS required when Angular is hosted by the same ASP.NET Core application?

Usually no, when Angular and the API are accessed through the same origin.

https://www.example.com/
https://www.example.com/api/products

These are same-origin requests.


6. Does ASP.NET Core execute Angular code?

No.

ASP.NET Core primarily serves Angular's generated static files in this setup.

The JavaScript is downloaded and executed by the browser:

ASP.NET Core
      ↓
Serves main-*.js
      ↓
Browser downloads it
      ↓
Browser executes Angular

This distinction is important.


7. Can Angular and ASP.NET Core also be deployed separately?

Yes. Both architectures are valid:

Combined:
ASP.NET Core
 ├── Angular
 └── API

or:

Separate:
Angular → HTTPS → ASP.NET Core API

8. Short interview answer

Yes. Angular's production build generates static files such as index.html, JavaScript bundles, CSS, and assets. These files can be placed in ASP.NET Core's wwwroot directory and served using UseStaticFiles(). MapFallbackToFile("index.html") is commonly used to support Angular client-side routing. When Angular and the API share the same origin, Angular can call endpoints using relative URLs such as /api/products, generally avoiding cross-origin CORS requirements.

← Back to Articles