无法加载configProtectedData Provider

时间:2014-03-14 17:09:44

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

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

错误消息通常是:

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 Provider,至少在我的环境中 - 程序集必须在GAC中。

     

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

     

问题2:一旦我在GAC中正确组装,(惊喜)错字。我在“type”属性中输入了类名错误

了解解决方案的思考过程

首先:关注Ivan Niktin的调试过程,第二个Fusion Logs are your friend

有意义的是它试图从临时ASP.Net文件加载它,因为这是一个MVC Web应用程序。

没有意义的是,正在搜索的临时ASP.Net文件位置为空。如果我将程序集添加到GAC然后加载正常,但这不是我的部署方案的选项。

Fusion Log显示为搜索的第一条路径:

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中的配置,主机项目和引用的程序集都在使用。 Net Framework 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为false,那么它应该只查看bin文件夹。如果shadowCopyBinAssemblies为true,那么卷影副本位置应该包含我的应用程序的dll以及它引用的任何dll - 它不应该为空。

2 个答案:

答案 0 :(得分:1)

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

我会尝试解决以下问题:

  • 尝试禁用节目复制(<hostingEnvironment shadowCopyBinAssemblies="false" />http://msdn.microsoft.com/en-us/library/system.appdomainsetup.shadowcopyfiles.aspx)以检查问题是否与临时ASP.NET文件有关。

  • 尝试使用VS中的“Break on exception”功能或使用异常处理程序获取有关异常的更多详细信息。检查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
    });
    
  • 尝试在单独的项目中加载有问题的程序集。即使是一个简单的控制台应用也没关系。

这些活动可以帮助您缩小问题的原因。

答案 1 :(得分:0)

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

我通过

解决了这个问题
  1. 删除从相对路径
  2. 引用的所有程序集
  3. 为所有项目手动删除 bin obj 文件夹中的调试发布文件夹。
  4. 从本地路径添加了程序集。
  5. 重建项目
  6. 事情开始奏效了。您也应该尝试这些步骤,这可能有助于解决问题。