ASP.NET Core:自定义IFileProvider可防止默认的IFileProvider工作

时间:2017-02-22 03:20:26

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc

我正在尝试从类库中的嵌入式资源中提供一些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和其他静态文件的问题?如果是这样,我应该在这里返回什么,以便系统知道使用其他文件提供程序?

1 个答案:

答案 0 :(得分:4)

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

CompositeFileProvider.cs - 根据GetFileInfo()中的实施情况,如果我希望其他提供商尝试解决此问题,我可以看到我应该传回null而不是NotFoundFileInfo(subpath)

StaticFileMiddleware.cs - 此文件显示如果在使用FileProvider设置静态文件配置时未指定nullapp.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代替。

现在一切都正常。