gpt4 book ai didi

c# - Entity Framework 6 : Unable to load the specified metadata resource

转载 作者:太空狗 更新时间:2023-10-29 17:51:51 24 4
gpt4 key购买 nike

首先,这与 SO 上的另一个问题有关:

我已通过以下 SO 文章和博客阅读并调试了我的问题:

MetadataException: Unable to load the specified metadata resource

http://blogs.teamb.com/craigstuntz/2010/08/13/38628/

但是......除了这个“修复”之外,我还有其他问题

我有一个 WebAPI (2.1),我的 WebAPI 中的连接字符串是这样的:

    <connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://*/ProjectModel.csdl|
res://*/ProjectModel.ssdl|
res://*/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework&quot;"
providerName="System.Data.EntityClient" />

当我在 WebAPI 中的 DbSet 上调用 ToList() 时(伪代码):

DbContext _DbContext = new ProjectEntities();
DbSet<TEntity> _dbSet = _DbContext.Set<TEntity>();
_dbSet.ToList();

效果很好!

当我从 WINDOWS SERVICE 中调用相同的方法时,出现以下错误: Error

连接字符串的 app.config 条目与 web.config 完全相同:

<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://*/ProjectModel.csdl|
res://*/ProjectModel.ssdl|
res://*/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework&quot;"
providerName="System.Data.EntityClient" />

现在,博客显示手动引用 dll:

<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://Project.Data.dll/ProjectModel.csdl|
res://Project.Data.dll/ProjectModel.ssdl|
res://Project.Data.dll/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework&quot;"
providerName="System.Data.EntityClient" />
</connectionStrings>

这不起作用/无法解决问题

我能够修复它的唯一方法是使用完全限定名称:

<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.csdl|
res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.ssdl|
res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string=&quot;
data source=192.168.250.125\sqlexpress;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework&quot;"
providerName="System.Data.EntityClient" />
</connectionStrings>

为什么会这样?为什么这在 Web 项目中有效,但在 Windows 服务项目中无效?我最近从 EF5 更改为 EF6,并且弹出了此错误 - 所有这些代码在升级 EF 之前都有效。有没有人知道为什么以及如何/如果我可以只使用 * 作为我的连接字符串中的 dll 名称?

我认为这是服务 .exe 运行位置的问题,并且没有在本地复制文件,但不是,Project.Data.dll 是那里是正确的版本。

我使用 FusionLog 尝试查找错误,但没有成功。我很困惑。

最佳答案

为什么会这样?

您遇到的问题只是在将您的应用程序作为 Windows 服务运行时防止二进制植入或 DLL 劫持攻击 (read more) 的额外安全措施的结果。

我为什么要关心?

您可能知道,有一个特定的 well documented查找每个引用的 DLL 文件的顺序。通常它会开始在当前应用程序目录中搜索 DLL,然后转到更多“公共(public)”位置,如 PATH 文件夹、GAC 等。

二进制植入的主要思想是将恶意 DLL 文件植入一个文件夹中,该文件夹先于合法 DLL 文件夹进行检查。加载此类恶意 DLL 将使攻击者获得对系统的控制权。

通常 Windows 服务在提升的帐户(LocalSystem、LocalService、NetworkService 等)下运行,因此 Windows 服务是二进制植入攻击的良好目标。

我能做什么?

Microsoft 已采取额外的预防措施来降低安全风险,这是有充分理由的。但您可以尝试解决您的问题。

1) 当前目录不是您期望的目录

Windows 服务在系统文件夹中启动(通常类似于 C:\Windows\System32)

好消息是它很容易修复。您只需在服务启动时更改当前目录。

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);

参见 blog post来自菲尔·哈克;

2) 通读文档

根据 EF documentation , 通配符有特殊含义,它限制了运行时查找 DLL 文件的位置:

If you specify a wildcard (*) for assemblyFullName, the Entity Framework runtime will search for resources in the following locations, in this order:

1) The calling assembly.

2) The referenced assemblies.

3) The assemblies in the bin directory of an application.

由于您的工作文件夹设置为系统文件夹并且您的引用可能不存在,EF 最终可能会查找错误的位置并且可能无法加载包含资源的程序集。

3) 使用完全限定的程序集名称确保安全

虽然我对此不完全确定并且没有测试过,但微软可能只是不允许 Windows 服务加载 DLL 而未提供完全限定的程序集名称以降低注入(inject)恶意 DLL 文件的风险;

关于保护 Windows 服务的好读物 here (特别是第 5 章)。

4) 调试它!

EF6 恰好是开源项目。这意味着您可以获得它的完整源代码并进行调试。您可以在 CodePlex 上找到项目 here .

关于c# - Entity Framework 6 : Unable to load the specified metadata resource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29018046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com