为什么在asp.net核心mvc中的EmbeddedFileProvider中找不到嵌入文件?

时间:2017-05-31 15:09:25

标签: asp.net-core-mvc

我目前正在尝试从外部程序集加载嵌入的ViewComponents。

我已将其包含在我的项目文件中:

<EmbeddedResource Include="Views\**\*.cshtml" />

所以当我检查实际的程序集并运行GetManifestResourceNames()时,我看到该文件已嵌入。

然后我在Startup.cs中的ConfigureService()中调用此方法:

public static IMvcBuilder GetModules(this IMvcBuilder mvcBuilder)
    {
        var embeddedFileProviders = new List<EmbeddedFileProvider>
        {
            new EmbeddedFileProvider(Assembly.GetCallingAssembly())
        };

        mvcBuilder.ConfigureApplicationPartManager(apm =>
        {
            foreach (string modulePath in Directory.GetFiles(Configuration.Settings.Path, "*.Module.dll"))
            {
                var assembly = Assembly.LoadFrom(modulePath);
                var startUpType = (from t in assembly.GetTypes()
                                   where t.GetInterfaces().Contains(typeof(IModuleStartup))
                                   select t).FirstOrDefault();

                RegisterModuleServices(mvcBuilder, startUpType);

                apm.ApplicationParts.Add(new AssemblyPart(assembly));        

                embeddedFileProviders.Add(new EmbeddedFileProvider(assembly));

                Modules.Assemblies.Add(assembly);                
            }

            var compositeFileProvider = new CompositeFileProvider(embeddedFileProviders);

            mvcBuilder.Services.AddSingleton<IFileProvider>(compositeFileProvider);

        });

        return mvcBuilder;
    }

我也没有使用

mvcBuilder.Services.Configure<RazorViewEngineOptions>(o => { o.FileProviders.Add(compositeFileProvider); });

因为这根本不起作用,甚至没有调用o.FileProviders.Add(compositeFileProvider)动作。

当我注入IFileProvider时找到所有嵌入式文件提供程序,但是当我运行_fileProvider.GetDirectoryContents(“”)时找不到任何文件;

有人知道为什么吗?

5 个答案:

答案 0 :(得分:3)

所以我弄清楚为什么它没有返回任何东西...... 在创建新的EmbeddedFileProvider时,我似乎没有设置baseNameSpace参数。傻啊。 但是有很多例子没有设置这个并且它有效。 希望如果他们遇到这个问题,这会帮助其他人。

答案 1 :(得分:1)

还要关注项目根命名空间设置。我的情况恰恰相反 - 我复制粘贴了一个项目文件,它没有保留上一个项目的命名空间设置。这是因为我没有在<RootNamespace>YourNameSpaceNameHere</RootNamespace>设置中明确设置.csproj (嵌套在顶部的<PropertyGroup>块下面),因此它将我的文件名作为命名空间!找到我的代码正确地设置了baseNameSpace参数,但项目将文件存储在不同的命名空间下,这是一个非常“困难”的时刻,并且浪费了很多时间! (您可以在任何文本编辑器中打开DLL,滚动到底部,您应该能够轻松地确定嵌入的文本以进行验证)。它就在那里,没找到。如果有人这样做,你也可以使用{Assembly}.GetManifestResourceNames()转储所有文件,并确保你的名字是正确的。

答案 2 :(得分:1)

在我的情况下,我有“。” (句点)在资源文件名中。

答案 3 :(得分:0)

导致此问题的另一个根本原因。我们已经将构建代理从windows迁移到linux,而后者的 FS区分大小写可以解决这个问题-它没有发现嵌入式资源:

<EmbeddedResource Include="swagger\ui\*" />

因为在文件系统上,我们有 S wagger \ ui \

因此@(EmbeddedResource)路径必须与文件系统路径相同:

<EmbeddedResource Include="Swagger\ui\*" />

(或重命名文件/目录以匹配@(EmbeddedResource)

答案 4 :(得分:0)

我在ASPNET Core 3.0项目中遇到此错误,该项目的外部类库中已正确嵌入了文件,但是Web应用程序在运行时找不到它们。事实证明,我从Internet复制的示例提供了一个名称空间,并且我复制了该 example 名称空间而未考虑其含义...

经过一番研究,我可以使用我自己的类库定义的正确根名称空间来修复它:

    var embeddedFileProvider =
        new Microsoft.Extensions.FileProviders
             .EmbeddedFileProvider(assembly, "ViewComponentLibrary");

更改为

var embeddedFileProvider =
    new Microsoft.Extensions.FileProviders
         .EmbeddedFileProvider(assembly, "MyProjectLibrary");