我有一个继承自Exception的类。在.NET 4中,我开始收到运行时错误:
重写成员时违反了继承安全规则:MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)'。覆盖方法的安全性可访问性必须与被覆盖的方法的安全性可访问性相匹配。
我认为问题是由于我重写了GetObjectData。
我知道解决问题的一个答案是设置SecurityRuleSet:
[assembly: SecurityRules(SecurityRuleSet.Level1)]
这不是一个可接受的答案,我想知道如何解决问题,而不必放松.NET 4中的默认安全规则。
用GetObjectData
标记SecurityCriticalAttribute
,因为它适用于Exception.GetObjectData
。被覆盖的成员应具有相同的安全可访问性(严重,安全关键或透明)。
有关更多信息,请阅读MSDN中的Security Changes in the .NET Framework 4和Security Transparent Code, Level 2。
要避免所有潜在的安全运行时异常,请使用安全规则集启用代码分析。您将获得可能与运行时错误相对应的静态分析警告。
当我调用具有AllowPartiallyTrustedCallers属性的程序集时出现此问题:
[assembly: System.Security.AllowPartiallyTrustedCallers]
删除它解决了我的问题,而没有切换到SecurityRuleSet.Level1。
关于允许完全信任应用程序的共享托管环境中的此错误。在bin部署应用程序时,通常会覆盖web.config。在IIS下,当您将信任设置更改为不同于默认设置时,您的Web配置部分将被修改为:
<system.web>
<trust level="Full" />
<system.web>
在部署期间复制新的web.config通常会覆盖此设置,但IIS Admin仍会将该站点显示为“完全信任”,而实际上该站点正在以共享主机提供商的默认信任级别运行(通常为中等) 。
您将看到此错误并执行我所做的操作 - 尝试找出为什么您会看到它,即使您知道该网站在完全信任下运行,但实际上,它不是。解决方案是在部署之前修改您的Web配置,或者使用IIS Admin将站点设置为不同的信任级别(例如,高),应用它,然后将其重新设置为完全。这样做会重新插入必要的配置文件信息,并以完全信任的方式重新启动应用程序池。
对我来说,问题出在log4net库中。我下载了源代码,并将项目文件添加到我的解决方案中,以便我可以进入外部库。但是,log4net需要为条件编译定义的NET_4_0
符号。默认情况下,它定义了NET_1_0
。我进入了log4net项目属性并将NET_1_0
更改为NET_4_0
,这解决了这个问题。
旁白:也许我没有通过在我的项目中包含库来遵循最佳实践。如果是这种情况,我会欢迎有关不同方法的反馈,以及每种选择的利弊。我目前的想法是,如果有错误,能够看到库的源代码将帮助我理解库的期望,这将帮助我清除错误。此外,看看其他人如何编写源代码,如果不是有价值的学习经验,那就没什么。基本上,我试图按照杰夫阿特伍德的建议找到here。但如果有更好的方法来实现这一目标,我会全力以赴。
我收到了这个错误,对我的情况毫无意义!我用了这个简单的例子https://www.c-sharpcorner.com/article/using-autofac-with-web-api
问题是我没有空间而且没有注意到它所以我通过在我的驱动器上留出空间来解决这个问题。
也许这会为某人节省几个小时无用的调查。