Установка index.html в качестве страницы по умолчанию в ядре asp.net

Как я могу получить ядро ​​asp.net для работы с файлом index.html внутри моего wwwroot?

Причина, по которой я хочу это сделать, заключается в том, что я разрабатываю приложение angular 4, используя CLI angular, и он заботится обо всем процессе сборки. Я установил его для сборки в каталог wwwroot моего основного проекта asp.net, но ядро ​​asp.net не хочет его обслуживать.

Сначала я попытался вернуть html файл через контроллер. Я пробовал этот маршрут:

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

И затем в контроллере я возвращаю html файл следующим образом:

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

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

Это не сработало. Он вернул 404 не найденное исключение и дал путь, но путь, который он дал, был правильным путем к файлу index.html(я вырезал и вставил его в проводник и файл открыл).

Я также объявляю их при запуске:

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

Затем я попытался удалить маршрут по умолчанию. Теперь я могу добраться до файла index.html, но только если я введу имя файла, то есть:

локальный: 58420/index.html

Если я попытаюсь получить доступ к корню домена без указанного "index.html", я получаю ошибку 404.

Каков правильный способ ссылки на index.html как страницу по умолчанию? Я предполагаю, что делать это с контроллера, вероятно, лучше, потому что тогда он будет совместим с маршрутизацией angular без перезаписи.

Ответ 1

Просто используйте это в startup.cs:

app.UseFileServer();

Это сокращение для:

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

... и это устраняет проблемы с необходимостью иметь их в правильном порядке (как показано выше)

Ответ 2

Мне нужно было объявить UseDefaultFiles() перед UseStaticFiles().

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

Ответ 3

Установите пакет NuGet Microsoft.AspNetCore.StaticFiles.

Теперь в методе Startup.Configure добавьте:

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();
}

Теперь вы должны получать файлы из wwwroot (используйте UseWebRoot если вы хотите изменить его на что-то другое).

Источник: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files

Ответ 4

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

Это оптимально, поскольку UseDefaultFiles переписывания URL UseDefaultFiles будет искать только UseDefaultFiles index.html, а не устаревшие файлы: default.htm, default.html и index.htm.

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

Ответ 5

Если вы хотите использовать другой документ, например foo.html, в качестве документа по умолчанию, вы можете сделать это, используя следующий код в методе Startup.Configure.

// 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();

Подход 2:

UseFileServer сочетает в себе функциональность промежуточного программного обеспечения UseStaticFiles, UseDefaultFiles и UseDirectoryBrowser. Промежуточное программное обеспечение DirectoryBrowser, позволяет просматривать каталоги и позволяет пользователям просматривать файлы в указанном каталоге. Мы могли бы заменить промежуточное ПО UseStaticFiles и UseDefaultFiles на промежуточное ПО UseFileServer.

// Use UseFileServer instead of UseDefaultFiles & UseStaticFiles

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

Ответ 6

Вы смешиваете как файлы MVC, так и файлы по умолчанию, используемые (useDefaultFiles). Прокомментируйте приведенные ниже строки из вашего кода.

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

и используйте только app.UseDefaultFiles();. Он начнет работать.

Ответ 7

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

Это должно помочь u