C# ASP.NET核心:自定义IFileProvider阻止默认IFileProvider工作
我试图从类库中的嵌入式资源中提供一些JavaScript。我设法找到了关于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
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
现在一切正常