Setting index.html as default page in asp.net core

拈花ヽ惹草 提交于 2019-12-04 09:55:34

问题


How can I get asp.net core to serve an index.html file from inside my wwwroot?

The reason I want to do this is because I an developing an angular 4 app using the angular CLI and it takes care of the entire build process. I have set it up to build into the wwwroot directory of my asp.net core project but asp.net core doesn't want to serve it.

At first I tried to return the html file through a controller. I tried this route:

app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}");
    });

And then in the controller I return the html file like this:

public IActionResult Index()
{
    var webRoot = _env.WebRootPath;
    var path = System.IO.Path.Combine(webRoot, "index.html");

    return File(path, "text/html");
}

This didn't work. It returned a 404 not found exception and gave the path but the path it gave was the correct path to the index.html file (I cut and pasted it into explorer and the file opened).

I am also declaring these in startup:

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

I then tried removing the default route. Now I am able to get to the index.html file but only if I type the filename in, i.e.:

localhost:58420/index.html

If I try to access the root of the domain without the "index.html" specified I get a 404 error.

What is the proper way to reference the index.html as the default page? I am guessing doing it from a controller is probably better because then it will be compatible with angular routing without rewrites.


回答1:


Just use this in startup.cs:

app.UseFileServer();

It's shorthand for:

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

... and it avoids issues with having to have those in the correct order (as shown above)




回答2:


I needed to declare UseDefaultFiles() before UseStaticFiles().

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



回答3:


Install the NuGet package Microsoft.AspNetCore.StaticFiles.

Now, in Startup.Configure method, add:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // Serve the files Default.htm, default.html, Index.htm, Index.html
    // by default (in that order), i.e., without having to explicitly qualify the URL.
    // For example, if your endpoint is http://localhost:3012/ and wwwroot directory
    // has Index.html, then Index.html will be served when someone hits
    // http://localhost:3012/
    app.UseDefaultFiles(); 

    // Enable static files to be served. This would allow html, images, etc. in wwwroot
    // directory to be served. 
    app.UseStaticFiles();
}

You should now get files served from wwwroot directory (use UseWebRoot if you want to change it to something else).

Source: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files




回答4:


app.UseDefaultFiles(new DefaultFilesOptions {
    DefaultFileNames = new List<string> { "index.html" }
});
app.UseStaticFiles();

This is optimal since the UseDefaultFiles URL rewriter will only search for index.html, and not for the legacy files: default.htm, default.html, and index.htm.

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-2.2#serve-a-default-document




回答5:


If you want to use another document like foo.html for example as your default document, you can do so using the following code in Startup.Configure method.

// Specify foo.html as the default document
DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions();
defaultFilesOptions.DefaultFileNames.Clear();
defaultFilesOptions.DefaultFileNames.Add("foo.html");
// Add Default Files Middleware
app.UseDefaultFiles(defaultFilesOptions);
// Add Static Files Middleware
app.UseStaticFiles();

Approach 2:

UseFileServer combines the functionality of UseStaticFiles, UseDefaultFiles and UseDirectoryBrowser middleware. DirectoryBrowser middleware, enables directory browsing and allows users to see files within a specified directory. We could replace UseStaticFiles and UseDefaultFiles middlewares with UseFileServer Middleware.

// Use UseFileServer instead of UseDefaultFiles & UseStaticFiles

FileServerOptions fileServerOptions = new FileServerOptions();
fileServerOptions.DefaultFilesOptions.DefaultFileNames.Clear();
fileServerOptions.DefaultFilesOptions.DefaultFileNames.Add("foo.html");
app.UseFileServer(fileServerOptions);



回答6:


// By default ASP.net core does not serve the static files such as HTML, css, image etc... I need to configure the middleware in the request processing pipeline for serving static files.

// This code would be written in Startup.cs class for configuring the middleware components.



  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {

        app.UseDefaultFiles(); // This sets the default page redirection for the in-comming request
            app.UseStaticFiles(); // This serves the static files to the client.

        }



回答7:


You are mixing both MVC and Default files serving (useDefaultFiles). Comment out the below lines from your code

app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}");
    });

and use only app.UseDefaultFiles();. It will start working.




回答8:


return File(System.IO.File.OpenRead(Path.Combine(HostingEnvironment.WebRootPath + "/index.html")), "text/html");

It has to help u



来源:https://stackoverflow.com/questions/43090718/setting-index-html-as-default-page-in-asp-net-core

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!