【问题标题】:Unable to Load configProtectedData Provider无法加载 configProtectedData 提供程序
【发布时间】:2014-03-14 17:09:44
【问题描述】:

我有一个引用程序集,其中 CopyLocal = True,该文件存在于 bin 文件夹中,但当我从 Visual Studio 运行解决方案时,它没有被复制到临时 ASP.NET 文件中

错误信息是正常的:

An error occurred loading a configuration file: Could not load file or assembly 'MyNamespace.Configuration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. 

解决方案/实际原因

有很多问题:

问题 1:为了加载 configProtectedData 提供程序,至少在我的环境中 - 程序集必须在 GAC 中。

融合日志揭示了其原因。虽然我的 Web 应用程序可以在 bin 文件夹中找到程序集 - Web 服务器(IIS Express)也需要加载它,而这部分失败了。由于网络服务器不知道我的 bin 文件夹,它唯一可能从中获取文件的地方是 GAC。 Fusion 显示 IIS Express 正在查看 Temp ASP .Net 文件夹,但我认为这可能是某种回退,在我的情况下,卷影副本确实是在复制程序集,但复制到不同的位置(临时 ASP IIS Express 不知道要查找的 .NET Files\root\4f27e88a\bfcf2f79\assembly\dl3\06324d99\85ff3c73_1943cf01)。

问题 2:一旦我在 GAC 中正确完成了程序集,(惊喜)错字。我在“类型”属性中的类名错误

解决方案的思考过程

第一:跟随Ivan Niktin的调试流程,第二Fusion Logs are your friend

它试图从 Temporary ASP.Net Files 加载它是有道理的,因为这是一个 MVC Web 应用程序。

没有意义的是,正在搜索的 Temporary ASP.Net Files 位置是空的。如果我将程序集添加到 GAC,那么它可以正常加载,但这不是我的部署方案的选项。

融合日志显示为搜索的第一个路径:

LOG: Attempting download of new URL file:
///C:/Users/Rob/AppData/Local/Temp/Temporary ASP.NET Files/root
/4f27e88a/bfcf2f79/MyNamespace.Configuration.DLL

其他路径是:

.../MyNamespace.Configuration.DLL
.../MyNamespace.Configuration/MyNamespace.Configuration.DLL
.../MyNamespace.Configuration.EXE
.../MyNamespace.Configuration/MyNamespace.Configuration.EXE

当我查看正在搜索 DLL 的文件夹的内容时 - 它是空的!

只涉及一个命名空间 MyNamespace.Configuration - 这是一个新的/几乎为空的程序集,除了 System 之外没有其他依赖项。GAC 中的配置,宿主项目和引用的程序集都使用 .网络框架 4.0

尝试加载受影响程序集的应用程序部分是:

<configProtectedData defaultProvider="DynamicFileConfigurationProvider">
        <providers>
            <add name="DynamicFileConfigurationProvider"
                 type="MyNamespace.Configuration.DynamicFileConfigurationProvider, 
                    MyNamespace.Configuration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=aeecd94c462a579a"
                 SelectorKeyProviderName="HostNameSelectorKeyProvider"/>    
        </providers>
    </configProtectedData>

更新:

将 shadowCopyBinAssemblies 设置为 false 会导致活页夹查看 ../Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/... 而不是之前的 IIS Express 位置

之前拦截异常并没有提供任何额外的信息,只是提示找不到文件。

在另一个主机中引用程序集,控制台和 Web 都没有显示任何信息,程序集加载正常并且可以调用方法。

手动将组件放置在活页夹正在寻找的位置也可以 - 在我看来,组件活页夹正在寻找错误的位置。即如果 shadowCopyBinAssemblies 为假,那么它应该只在 bin 文件夹中查找。如果 shadowCopyBinAssemblies 为真,则卷影副本位置应包含我的应用程序的 dll 以及它引用的任何内容 - 它不应为空。

【问题讨论】:

  • 该文件不需要被复制到那里,它应该只需要存在于您的 Web 应用程序的 bin 文件夹中。你确定这是它在日志中搜索的唯一路径吗?另外,我注意到错误消息引用了 MyNamespace.MyDll,而融合日志引用了 MyNamespace.Configuration.dll。你有没有被复制的传递依赖?
  • 感谢 Craig W。我已将日志中的其他路径添加到答案并更正了命名,其中只涉及一个命名空间 MyNamespace.Configuration - 这是一个新的/几乎空的程序集,没有其他依赖项与 GAC 中的 System.Configuration 相比,宿主项目和引用的程序集都使用 .Net Framework 4.0
  • 作为@CraigW。说,文件应该复制到那里。所以,我推荐一种不同的方法来解决这个错误。问题是您的程序集无法加载,但解决方案不是将程序集放在那里。检查其他属性(例如 Use Specific Version¿?)并确保您的构建可以无错误地编译。
  • 这听起来很傻,但是转到引用程序集的属性并将 CopyLocal 从 true 切换到 false 并再次返回。我似乎记得 Visual Studio 的一个版本中的一个问题,其中该属性将在属性网格中显示为true,但如果您查看 .csproj,它没有设置。
  • 哈 :-) 一点也不傻 Craig W,我已经阅读了 VS 的已知问题并在本地复制 - 唉!我已经这样做了。

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


【解决方案1】:

基本上,Temporary ASP.NET Files 文件夹包含程序集副本,以允许 bin 文件夹中的文件更新。当运行时加载程序集时,它会被锁定,因此您无法更新服务器上的程序集。为了解决这个问题,运行时将它们复制到“Temporary ASP.NET Files”文件夹中。

我会尝试解决以下问题:

  • 尝试禁用显示复制(&lt;hostingEnvironment shadowCopyBinAssemblies="false" /&gt;http://msdn.microsoft.com/en-us/library/system.appdomainsetup.shadowcopyfiles.aspx)以检查问题是否真的与临时 ASP.NET 文件有关。

  • 尝试使用 VS 中的“异常中断”功能或使用异常处理程序来获取有关异常的更多详细信息。检查 exception.Data 和 .FusionLog 属性以获取有关异常的更多详细信息。

    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler((x, y) =>
    {
        var exception = y.ExceptionObject as System.IO.FileNotFoundException;
    
        if (exception != null)
            // Retrieve exception information here
    });
    
  • 尝试将有问题的程序集加载到单独的项目中。即使是一个简单的控制台应用程序也可以。

这些活动将让您缩小问题的原因。

【讨论】:

  • 感谢您的回答!一些好主意;我已经用我的发现更新了问题
  • 被选为答案,因为这对将来发现此问题的人最有用
【解决方案2】:

不确定 MVC 应用程序中的原因,但我在 基于 Web 表单的 Web 应用程序中遇到了类似的问题,其中我们设置为 CopyLocal = True 的 Referenced Assembly。我的 Web 项目从 GAC 和位于解决方案内的相对路径中的文件夹中引用程序集。

我解决了这个问题

  1. 从相对路径中删除所有引用的程序集
  2. 手动删除了所有项目的 binobj 文件夹中的 debugrelease 文件夹。李>
  3. 从本地路径添加回程序集。
  4. 重新构建项目

事情开始奏效了。您可能也应该尝试这些步骤,这可能有助于解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多