从MQ .NET Client 1.0迁移至8.0.0.4后,SSIS脚本任务调用MQ管理器报错
解决MQ .NET Client 8.0.0.4在SSIS 2012脚本任务中加载System.Web失败的问题
我之前帮同行解决过几乎一模一样的问题——为啥Windows服务里调用MQ管理器好好的,一放到SSIS 2012的脚本任务里就报System.IO.FileLoadException?核心原因就是SSIS脚本任务的执行上下文、权限模拟规则和Windows服务完全不一样,尤其是涉及到System.Web这类和ASP.NET相关的程序集时,默认的模拟级别不够,就会触发加载失败。
下面是几个针对性的解决办法,按优先级来试:
1. 调整SSIS脚本任务的模拟级别设置
这是最快速的排查步骤:
- 打开你的SSIS 2012包,选中脚本任务,右键打开属性窗口
- 找到
ImpersonationLevel属性,把默认的Impersonate改成Delegate或者Identify - 保存包后重新执行,这个设置能提升脚本任务的权限模拟等级,让它有足够权限加载
System.Web程序集
2. 确保System.Web程序集在GAC中正确注册
虽然System.Web是.NET Framework 4.0自带的程序集,但SSIS的加载路径有时候会抽风:
- 以管理员身份打开Visual Studio命令提示符(对应.NET 4.0的版本)
- 执行以下命令强制注册程序集:
gacutil /i "C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Web.dll" - 注册完成后,重启SSIS服务和Visual Studio,再测试脚本任务
3. 给脚本任务添加自定义程序集绑定配置
如果上面的方法没用,咱们可以强制指定System.Web的加载路径:
- 打开脚本任务的编辑界面,进入脚本项目(比如C#项目)
- 添加一个
App.config文件到项目中 - 在
<configuration>节点下粘贴以下配置:<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> <codeBase version="4.0.0.0" href="file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/System.Web.dll" /> </dependentAssembly> </assemblyBinding> </runtime> - 保存配置,重新编译脚本任务,再执行SSIS包
4. 检查SSIS执行账户的权限
如果是用SQL Server Agent执行SSIS包,或者用特定账户手动执行,得确保这个账户有足够权限:
- 给执行账户添加
C:\Windows\Microsoft.NET\Framework\v4.0.30319目录的读取权限 - 如果是SQL Server Agent,把Agent服务账户临时添加到本地
Administrators组测试(测试通过后再调整到最小权限),同时确保账户能访问MQ服务器的资源
总结一下,这个问题本质是SSIS的沙箱环境和Windows服务的执行环境差异导致的,重点解决权限模拟和程序集加载上下文这两个点就行。
内容的提问来源于stack exchange,提问作者nitin Sane
相关产品推荐
相关产品推荐

