ASP.NET Core 404 Error on IIS 10

85,004

Solution 1

You code is working on my machine with Kestrel. A good troubleshooting step is to find out whether the problem is with your ASP.NET Core application or with your IIS Hosting configuration.

Try this from the root of your project.

dotnet restore
dotnet run

You will see something like this:

Hosting environment: Production
Content root path: C:\MyApplicationPath
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

In your browser go to the following two URLs. If they don't work, then something is wrong with your application. If they do work, something is wrong with your IIS hosting.

localhost:5000        // you will see your index.html page
localhost:5000/api    // you will see your default routes output

Solution 2

In my case the problem was that my controller threw an exception, thus the framework tried to use the exception handler page which was no available, thus the 404 error, the controller itself was throwing 500 error

Solution 3

For the benefit of searchers.

I was getting a 404 when Using IIS. I had followed the correct procedure for publishing (here) and deployment as detailed here.

It took some time to figure out, but I eventually found the answer hidden in a Rick Strahl blog post.

Basically, when making the application pool, as well as setting it to 'No Managed Code', I also needed to go into the advanced settings and set the Application Pool Identity to 'Network Service'. It was fine under ApplicationPoolIdentity on my machine, but not on a machine I deployed to.

enter image description here

So, for clarity, my full procedure was:

To create package:

  1. Create dotnet core website (I used Visual Studio 2017)
  2. Publish. Could have used VS's publish function, but I used CLR via the package manager. The command was:

    dotnet publish -c Release -r win-x64 --self-contained

I had to use the win-x64 identifier as we have to be compatible with 64-bit Windows Server 2008.

To deploy:

  1. Make a folder in C:\inetpub\wwwroot (e.g. 'testsite')
  2. Take the contents of the publish folder ({root}\bin\Release\netcoreapp2.1\win-x64\publish) and copy it to the new 'testsite' folder (or your equivalent).
  3. Install the dotnet core runtime (not SDK!) on the host machine.
  4. Open IIS. Right click 'Application pools', then 'Add Application Pool'. Create one with the .NET CLR Version set to 'No Managed Code'.
  5. (my machine didn't need this step, but server did).Click on Application pools again. Right click your new App Pool and Choose 'Advanced Settings'. Change the identity to 'Network Service' (as shown in the picture above).
  6. Back at top level IIS, Expand 'Default Web Site', right click the folder of your website and choose 'Convert to application'. Choose your new App Pool with No Managed Code.
  7. Open command prompt as admin and iisreset . You should only need this the first time after you've installed the dotnet core runtime.
  8. Visit the site (e.g. http://localhost/testsite)

Solution 4

I'm a noob with windows IIS deployments so this answer might seem obvious to some people.

I was missing a key file - web.config which IIS needs in order to run your web application. I used the web.config configurations specified here:

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/web-config?view=aspnetcore-5.0

Specifically, the configurations for ASP.NET Core Module.

Solution 5

If you are using an api call make sure you class has:

[Route("api/[controller]")] [ApiController]

above where the class is instantiated.

Also make sure you have: [HttpGet()] for example above the api method you are trying to debug.

Share:
85,004
Mate Zabo
Author by

Mate Zabo

Updated on July 17, 2021

Comments

  • Mate Zabo
    Mate Zabo almost 3 years

    I have a problem with ASP.NET Core web application running on IIS 10. I am developing a Single Page Application with AngularJS.

    The index.html loads perfectly but the backend requests are failing with 404 error code on the IIS 10. From Visual Studio with IIS Express it works perfectly.

    Can anyone spot how can I fix the backend requests?

    Here's my Program.cs

    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();
    
        host.Run();
    }
    

    And here's my Configure method from Startup.cs

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseDefaultFiles();
    
        app.UseStaticFiles();
    
        app.UseIdentity();
    
        // Custom middleware for Angular UI-Router
        app.Use(async (context, next) =>
        {
            if (!Path.HasExtension(context.Request.Path.Value)
            && context.Request.HttpContext.Request.Headers["X-Requested-With"] != "XMLHttpRequest"
            && context.Request.Method.ToUpper() != "POST"
            && context.Request.Method.ToUpper() != "PUT"
            && context.Request.Method.ToUpper() != "DELETE")
            {
                await context.Response.WriteAsync(File.ReadAllText(env.WebRootPath + "/index.html"));
            }
    
            await next();
        });
    
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "api/{controller=Home}/{action=Index}/{id?}");
        });
    }
    
  • Mate Zabo
    Mate Zabo almost 8 years
    Thanks I could fix it. The problem was with my application but it is a little bit weird thing to throw a 404 error if something wrong with the application.
  • Shaun Luttin
    Shaun Luttin almost 8 years
    What was wrong with the application? What did your fix involve?
  • Mate Zabo
    Mate Zabo almost 8 years
    The problem was a missing configuration file. I have 3 environment appsettings file for Development, Staging and Production with the necessary connection strings. The default publish option contains only the appsettings.json. So I need to change the value to appsettings*.json to copy all of the environment settings.
  • Aage
    Aage almost 4 years
    According to the MSDN docs you don't need to install the runtime when it's self contained: docs.microsoft.com/en-us/dotnet/core/deploying
  • JsAndDotNet
    JsAndDotNet almost 4 years
    @Aage - that's a good point - you wouldn't need it for self contained. You will of course still need the .NET Core IIS Hosting Bundle
  • Hristo Alexsiev
    Hristo Alexsiev almost 4 years
    How did you troubleshoot
  • Mocas
    Mocas almost 4 years
    Yeah, I would be interested to know too. In the development mode the exception should be showing on the page, but it isn't. Not sure if there is an exception that is causing my 404 or not
  • Mocas
    Mocas almost 4 years
    I think the routing is broken for some reason, I can get to the paga if I include the full path,... This will work -> localhost:5001/home/index.... This won't work -> localhost:5001/home neither this localhost:5001
  • Akbar Asghari
    Akbar Asghari over 3 years
    for check this answer add try catch statement in you controller
  • Christopher Painter
    Christopher Painter almost 3 years
    Very useful. My API is actually working through IIS and through running the EXE on the server. It seems it's my Swagger page that is giving me the 404.
  • mirageservo
    mirageservo almost 3 years
    Mentioning Swagger gave me an idea, I was receiving 404 accessing example.com/mysitepoolname, it turns out I just need to access the correct URL at example.com/swagger/index.html and voila, works just fine. (hope to save someone from wasting time digging for a solution)