app.UseDefaultFiles 在 Kestrel 中什么也没做?
app.UseDefaultFiles in Kestrel not doing anything?
我在一个小项目的 Startup.cs 文件中有这个文件,该文件用于一个使用 Kestrel 托管静态文件的网络服务器:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json");
var config = configBuilder.Build();
var options = new RewriteOptions()
.AddRedirectToHttps();
app.UseRewriter(options);
DefaultFilesOptions defoptions = new DefaultFilesOptions();
defoptions.DefaultFileNames.Clear();
defoptions.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(defoptions);
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"static")),
RequestPath = new PathString("")
});
loggerFactory.AddConsole(config.GetSection(key: "Logging"));
}
}
但是,它不会尝试加载 index.html 或任何内容。如果我手动访问它,它确实有效。
有什么想法吗?
谢谢
理想情况下,您的 index.html
应该位于网络根路径 (wwwroot
) 下,但是,如果您的文件位于 ContentRootPath\static
下(看起来是这样),您将需要更改您的代码以指定 DefaultFilesOptions.FileProvider
,如下所示:
PhysicalFileProvider fileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"static"));
DefaultFilesOptions defoptions = new DefaultFilesOptions();
defoptions.DefaultFileNames.Clear();
defoptions.FileProvider = fileProvider;
defoptions.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(defoptions);
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = fileProvider,
RequestPath = new PathString("")
});
注意: 你最好在第一行使用 IHostingEnvironment.ContentRootPath
(env.ContentRootPath
) 而不是 Directory.GetCurrentDirectory()
(以防万一你想在某个时候更改 WebHostBuilder
中的内容根目录)。
感谢 CalC 的洞察力,这让我更接近 asp.net 核心 2.2 的答案。这是我最终需要做的,以便在 Azure 中的主 Web 服务器根目录之外提供默认文档:
public void Configure(IApplicationBuilder app){...
// content is physically stored at /site/abc on an Azure Web App, not /site/wwwroot/abc
string path = Path.Combine(Directory.GetCurrentDirectory(), "abc");
PhysicalFileProvider fileProvider = new PhysicalFileProvider(path);
DefaultFilesOptions options = new DefaultFilesOptions
{
FileProvider = fileProvider,
RequestPath = "/ABC",
};
options.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(options);
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = fileProvider,
RequestPath = "/ABC"
});
}
密钥使用匹配的 RequestPath 和 FileProvider 值
我在一个小项目的 Startup.cs 文件中有这个文件,该文件用于一个使用 Kestrel 托管静态文件的网络服务器:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json");
var config = configBuilder.Build();
var options = new RewriteOptions()
.AddRedirectToHttps();
app.UseRewriter(options);
DefaultFilesOptions defoptions = new DefaultFilesOptions();
defoptions.DefaultFileNames.Clear();
defoptions.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(defoptions);
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"static")),
RequestPath = new PathString("")
});
loggerFactory.AddConsole(config.GetSection(key: "Logging"));
}
}
但是,它不会尝试加载 index.html 或任何内容。如果我手动访问它,它确实有效。
有什么想法吗?
谢谢
理想情况下,您的 index.html
应该位于网络根路径 (wwwroot
) 下,但是,如果您的文件位于 ContentRootPath\static
下(看起来是这样),您将需要更改您的代码以指定 DefaultFilesOptions.FileProvider
,如下所示:
PhysicalFileProvider fileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"static"));
DefaultFilesOptions defoptions = new DefaultFilesOptions();
defoptions.DefaultFileNames.Clear();
defoptions.FileProvider = fileProvider;
defoptions.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(defoptions);
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = fileProvider,
RequestPath = new PathString("")
});
注意: 你最好在第一行使用 IHostingEnvironment.ContentRootPath
(env.ContentRootPath
) 而不是 Directory.GetCurrentDirectory()
(以防万一你想在某个时候更改 WebHostBuilder
中的内容根目录)。
感谢 CalC 的洞察力,这让我更接近 asp.net 核心 2.2 的答案。这是我最终需要做的,以便在 Azure 中的主 Web 服务器根目录之外提供默认文档:
public void Configure(IApplicationBuilder app){...
// content is physically stored at /site/abc on an Azure Web App, not /site/wwwroot/abc
string path = Path.Combine(Directory.GetCurrentDirectory(), "abc");
PhysicalFileProvider fileProvider = new PhysicalFileProvider(path);
DefaultFilesOptions options = new DefaultFilesOptions
{
FileProvider = fileProvider,
RequestPath = "/ABC",
};
options.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(options);
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = fileProvider,
RequestPath = "/ABC"
});
}
密钥使用匹配的 RequestPath 和 FileProvider 值