我正在尝试从类库中的嵌入式资源中提供一些JavaScript。我设法找到了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和其他静态文件的问题?如果是这样,我应该在这里返回什么,以便系统知道使用其他文件提供程序?
答案 0 :(得分:4)
在对源代码进行一点挖掘之后确定(.NET现在开源是不是很好?!),我设法发现以下链接确实非常有用:
CompositeFileProvider.cs
- 根据GetFileInfo()
中的实施情况,如果我希望其他提供商尝试解决此问题,我可以看到我应该传回null
而不是NotFoundFileInfo(subpath)
。
StaticFileMiddleware.cs
- 此文件显示如果在使用FileProvider
设置静态文件配置时未指定null
(app.UseStaticFiles
),则它将使用以下代码行解析一个:
_fileProvider = _options.FileProvider ?? Helpers.ResolveFileProvider(hostingEnv);
查看Helpers.cs会显示以下代码:
internal static IFileProvider ResolveFileProvider(IHostingEnvironment hostingEnv)
{
if (hostingEnv.WebRootFileProvider == null)
{
throw new InvalidOperationException("Missing FileProvider.");
}
return hostingEnv.WebRootFileProvider;
}
因此,我使用HostingEnvironment.ContentRootFileProvider
的假设不正确。我应该使用HostingEnvironment.WebRootFileProvider
代替。
现在一切都正常。