对ASP.NET网站执行代码覆盖率测试发生System.Security.VerificationException异常的解决方案

简介:

当你对ASP.NET 4.0网站执行代码覆盖率测试时,可能会遇到下面这个异常:

System.Security.VerificationException: Operation could destabilize the runtime.

一般来说,VerificiationException都是关于代码访问安全(CAS)的问题,.NET在执行托管代码之前,首先会验证这个托管程序的强签名,通过确定其来源来判定该托管程序应该拥有的权限。比如说,如果托管程序是微软公司的签名,我们当然是无比的信任它—除非你不用Windows操作系统。机器管理员也可以依据托管程序的来源来决定该托管程序应该拥有的权限,例如读磁盘文件、操作注册表这些操作都是可以配置的权限。比方说,管理员可以在机器上设置,由360以及QQ发行的托管程序,只能访问显卡(绘制界面)以及读写网络,而不能执行访问磁盘文件等操作。

执行代码安全的前提是,整个程序完全是由托管代码写成的,如果托管代码里混合非托管代码,无论是通过托管C++写成的,还是里面执行了平台调用(P/Invoke)。就破坏规矩了,因为非托管代码可以使用指针操作,以及调用其它非托管代码的方式,甚至—启动一个进程,然后将原来的托管程序杀掉。因此,进行代码访问安全的前提条件是,整个应用程序都是使用托管代码写成的,为了保证这个前提条件,CLR在执行托管程序之前,首先会验证程序是否满足—整个程序都是用托管代码编写这一条件。如果不满足这个条件,那么CLR会扔出VerificationException,中断托管程序的执行,在.NET SDK里,你可以通过PEVerify.exe这个程序验证一个程序是否可以通过这个验证。

 

当然,你可能会说,很多本机运行的托管程序,即使调用了非托管代码,例如执行了一个平台调用,还是可以照常执行啊。那是因为,当你的程序使用了/unsafe编译选项时,C#编译器会自动在托管程序添加上SuppressUnmanagedCodeSecurityAttribute这个属性,这个属性告诉CLR。如果程序是在本机执行,那么就跳过验证是否调用了非托管代码这一环节。有兴趣的读者可以把调用非托管代码的托管程序放在一个网络路径上,从那里执行,应该就可以看到SecurityException了。

 

回到ASP.NET网站的情形,当你将ASP.NET网站的装配件(Assembly)使用 vsinstr.exe创建一个可以收集代码覆盖率的装配件(Assembly)时,vsinstr.exe实际上在装配件(Assembly)的IL代码里,添加了很多收集代码覆盖率的代码。这个过程可以参考我以前的文章:软件自动化测试—代码覆盖率。这些代码里,有一个很重要的步骤,就是联系本机运行的VSPerfMon.exeVSPerfMon.exe是用来收集整个机器上代码覆盖率的,不知道是什么愿意,联系本机运行的VSPerfMon.exe过程是通过非托管的API实现的,这就意味着vsinstr.exe生成的 装配件(Assembly)就必须调用到非托管代码,因此也就通过CLR的验证过程。

 

在2.0的时候,你可能还不会碰到这个问题,但是在4.0里面,你就很有可能碰到这个问题—特别是在网站运行在IIS下的话,经常发生。

 

既然道理已经明白了,修复起来也很容易:

  1. 将网站,以及所有需要做代码覆盖率的装配件(Assembly)—也就是被vsinstr.exe处理过的装配件(Assembly),在它们的源代码(既然你要收集代码覆盖率,那肯定是由源代码的)里的AssemblyInfo.cs里,加上下面这一行

 

[assembly: SecurityRules(SecurityRuleSet.Level1, SkipVerificationInFullTrust=true)]

 

  1. 然后在网站的web.config里,做如下修改(这个选项也可以通过IISAdmin.exe修改):

 

 <system.web>

    <trust level="Medium" />

 

     …

 </system.web>

 

说明,SecurityRules这个属性,告诉CLR,这个装配件(Assembly)有自定义的安全机制,SecurityRuleSet.Level1说明采用.NET 2.0下面的安全验证策略,SkipVerificationInFullTrust告诉CLR,只有网站运行在FullTrust模式下,才可以跳过安全验证。最后第二步就是将网站的运行模式改在FullTrust模式下。

标签:  CLR


本文转自 donjuan 博客园博客,原文链接:   http://www.cnblogs.com/killmyday/archive/2010/11/16/1878847.html ,如需转载请自行联系原作者
相关文章
|
18天前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
33 8
|
18天前
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
34 7
|
1月前
|
Cloud Native 数据处理
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
|
15天前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
33 0
|
15天前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
50 0
|
24天前
|
测试技术
如何使用 JUnit 测试方法是否存在异常
【8月更文挑战第22天】
14 0
|
2月前
|
测试技术 C#
.NET单元测试使用Bogus或AutoFixture按需填充的几种方式和最佳实践
【7月更文挑战第13天】AutoFixture 和 Bogus 都是流行的 C#库,用于在单元测试中按需填充测试数据。以下是它们的几种使用方式和最佳实践:一、AutoFixture:1.直接定制 2.使用匿名函数 3.实现ICustomization接口 4.使用Build方法。 二、最佳实践Bogus:1.安装2.使用。
|
1月前
|
测试技术
单元测试问题之在单元测试中,方法的返回值或异常,如何验证
单元测试问题之在单元测试中,方法的返回值或异常,如何验证
|
1月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
1月前
|
开发框架 .NET API
在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常
在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常