C# ASP.NET核心:自定义IFileProvider阻止默认IFileProvider工作

C# ASP.NET核心:自定义IFileProvider阻止默认IFileProvider工作,c#,asp.net-mvc,asp.net-core,asp.net-core-mvc,C#,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,我试图从类库中的嵌入式资源中提供一些JavaScript。我设法找到了关于IFileProvider的IFileProvider,并创建了我自己的,现在运行良好。但是,我现在遇到的问题是不再找到物理静态文件(来自wwwroot) 我的Startup.cs文件中有以下内容: app.UseStaticFiles( new StaticFileOptions() { // Override file provider to allow embedded resources

我试图从类库中的嵌入式资源中提供一些JavaScript。我设法找到了关于IFileProvider的
IFileProvider
,并创建了我自己的,现在运行良好。但是,我现在遇到的问题是不再找到物理静态文件(来自wwwroot

我的
Startup.cs
文件中有以下内容:

app.UseStaticFiles(
   new StaticFileOptions()
   {
       // Override file provider to allow embedded resources
       FileProvider = new CompositeFileProvider(
           HostingEnvironment.ContentRootFileProvider,
           new EmbeddedScriptFileProvider()),

       //etc
   });
我假设使用
CompositeFileProvider
意味着如果在其中一个文件提供程序中找不到该文件,那么它将尝试另一个文件提供程序。我还假设默认文件提供程序是我指定为
HostingEnvironment.ContentRootFileProvider
的文件提供程序。这是不对的吗

我唯一能想到的另一件事是,问题来自我的提供者本身的
GetFileInfo()
方法。其定义如下:

public IFileInfo GetFileInfo(string subpath)
{
    if (string.IsNullOrEmpty(subpath))
    {
        return new NotFoundFileInfo(subpath);
    }

    if (subpath.StartsWith("/", StringComparison.Ordinal))
    {
        subpath = subpath.Substring(1);
    }

    var metadata = EmbeddedScripts.FindEmbeddedResource(subpath);

    if (metadata == null)
    {
        return new NotFoundFileInfo(subpath);
    }

    return new EmbeddedResourceFileInfo(metadata);
}

是否返回
NotFoundFileInfo(subpath)
会导致我的物理css、js和其他静态文件出现问题?如果是这样的话,我应该在这里返回什么,以便系统知道如何使用其他文件提供程序?

好的,在对源代码进行了一点挖掘之后(现在.NET是开源的,这不是很好吗?!),我设法发现以下链接确实非常有用:

-根据
GetFileInfo()
中的实现,如果我希望其他提供程序尝试解决它,我可以看到我应该传回
null
,而不是
NotFoundFileInfo(子路径)

-此文件显示,如果在使用
app.UseStaticFiles
设置静态文件配置时未指定
FileProvider
null
),则它将使用以下代码行解析其中一个:

\u fileProvider=\u options.fileProvider??Helpers.ResolveFileProvider(hostingEnv)

查看显示了以下代码:

internal static IFileProvider ResolveFileProvider(IHostingEnvironment hostingEnv)
{
    if (hostingEnv.WebRootFileProvider == null)
    {
        throw new InvalidOperationException("Missing FileProvider.");
    }
    return hostingEnv.WebRootFileProvider;
}
因此,我使用
HostingEnvironment.ContentRootFileProvider
的假设是不正确的。我应该改用
HostingEnvironment.WebRootFileProvider

现在一切正常