Ответ 1
Просто используйте это в startup.cs
:
app.UseFileServer();
Это сокращение для:
app.UseDefaultFiles();
app.UseStaticFiles();
... и это устраняет проблемы с необходимостью иметь их в правильном порядке (как показано выше)
Как я могу получить ядро 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 без перезаписи.
Просто используйте это в startup.cs
:
app.UseFileServer();
Это сокращение для:
app.UseDefaultFiles();
app.UseStaticFiles();
... и это устраняет проблемы с необходимостью иметь их в правильном порядке (как показано выше)
Мне нужно было объявить UseDefaultFiles() перед UseStaticFiles().
app.UseDefaultFiles();
app.UseStaticFiles();
Установите пакет 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
app.UseDefaultFiles(new DefaultFilesOptions {
DefaultFileNames = new List<string> { "index.html" }
});
app.UseStaticFiles();
Это оптимально, поскольку UseDefaultFiles
переписывания URL UseDefaultFiles
будет искать только UseDefaultFiles
index.html
, а не устаревшие файлы: default.htm
, default.html
и index.htm
.
Если вы хотите использовать другой документ, например 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);
Вы смешиваете как файлы MVC, так и файлы по умолчанию, используемые (useDefaultFiles). Прокомментируйте приведенные ниже строки из вашего кода.
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}");
});
и используйте только app.UseDefaultFiles();
. Он начнет работать.
return File(System.IO.File.OpenRead(Path.Combine(HostingEnvironment.WebRootPath + "/index.html")), "text/html");
Это должно помочь u