我遇到了这个奇怪的问题。在我的WCF项目中,我引用了一个使用SQLite查询某些静态数据的类库。自然地,该类库使用的是NuGet的System.Data.Sqlite + System.Data.SQLite.Core + System.Data.SQLite.EF6 + System.Data.SQLite.Linq。 WCF项目本身不执行查询。它从执行该操作的类库中调用一个方法。
当我在开发机器上运行它时,一切都很好。但是在将其部署到Windows Server 2012上的IIS之后,引发了异常Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
。我确实搜索了SO,发现我需要在主WCF项目中至少引用System.Data.SQLite.Core,并确保它分别具有x64和x86文件夹以及每个文件夹中相应的Sqlite.Interop.dll。所述文件夹是使用NuGet引用自动生成的,并放置在 bin 文件夹下。所以我很高兴。部署。发生了同样的事情:开发机器一切正常,然后无法在服务器上加载DLL。
我什至尝试引用WCF主项目中的所有NuGet软件包都无济于事。然后我想到尝试将dll从x64文件夹手动复制到我的bin根文件夹,与wcf.dll和System.Data.SQLite.dll一起。现在,错误消息已更改为Unable to load DLL 'SQLite.Interop.dll': Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
,而不是未找到。
授予所有权限后,它就可以了!
但是这种行为使我感到奇怪,因为在我的开发机和另一台测试服务器上,我无法重现此行为。仅在生产服务器上才会引发此错误。
有什么我忽略的东西吗?顺便说一句,我试图将WCF项目从仅将AnyCPU定位为x64。我尝试在IIS AppPool的高级设置中使用启用32位。在所有DLL都位于bin根目录下之前,所有方法都无效。
答案 0 :(得分:2)
我可能在这里。我做了一个检举。在我看来,x86下的dll已成功找到。但是,它拒绝对 CreateFile 操作的访问。
现在看来它属于许可领域。在测试环境和我的开发机上,AppPool具有上帝的特权,因此该问题无法重现。
TL; DR 然后,我进入了权限详细信息。我发现WCF apppool身份仅对 x86 \ Sqlite.Interop.dll 具有 Read 权限。我添加了读取并执行,问题就消失了。您的年龄可能会有所不同,可能是需要许可的x64。
经过思考: 现在,我将花几天时间进行观察,但是我认为就是这样。尽管procmon表示创建文件失败,但这并不意味着它需要写权限。
进一步的测试表明我的权限设置已关闭,因为我使用了Visual Studio Deploy功能来部署我的网站。在此过程中,它将我的网站根目录设置为仅 Read 。