6

我在一个小型项目的 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 或任何内容。如果我手动访问它,它确实有效。

有任何想法吗?

谢谢

4

2 回答 2

10

理想情况下,您index.html应该位于 Web 根路径 ( 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在某些时候更改内容根目录)。

于 2017-11-17T13:44:43.560 回答
2

感谢 CalC 的洞察力,这让我更接近 asp.net core 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 值

于 2019-06-26T02:02:02.697 回答