由于错误 0xC0011008,包加载失败,从 XML 加载时出错

由于错误 0xC0011008,包加载失败,从 XML 加载时出错

环境:

  • Windows Server 2008 SP2 企业版 64 位

  • SQL Server 2008 SP3 标准版 64 位

  • 以前使用过 SQL Server2005开发人员版 32 位集成服务。现已卸载。

  • ASP.NET 版本

  • IIS 7

我们的 ASP.NET 应用程序需要使用 ManagedDTS.dll 程序集在进程内执行 SSIS 包。我们在 BIDS 2008(而不是 2005)中开发 SSIS 包,以便可以导入/导出 Excel 2007-2010 文件。我们的 ASP.NET 应用程序是在 Visual Studio .NET 2010 中开发的,编译为 .NET Framework 4 代码。我在 32 位 Windows 7 开发计算机上引用了以下版本的 ManagedDTS.dll。

C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll

我们将应用程序部署到 Windows 2008 64 位服务器上。该服务器上的 IIS 7 用于切换以 32 位或 64 位模式运行我们的应用程序。

当我们在 64 位模式下运行应用程序并执行 SSIS 包时,包正确解析。但是,它给出了一个运行时错误,告诉我们 64 位版本的 SSIS 不支持 Excel 连接管理器。不过,这不是我现在需要解决的问题。

真正的问题在于当应用程序以 32 位模式运行时执行包。执行抛出未处理的异常,并显示以下错误消息:

The package failed to load due to error 0xC0011008 “Error loading from XML.
No further detailed error information can be specified for this problem
because no Events object was passed where detailed error information can be stored.”.
This occurs when CPackage::LoadFromXML fails.

此错误消息让我认为包正在被 SSIS 2005 xml 解析器解析。这不可能,因为我已经完全卸载了 SSIS 2005。

有趣的信息

所以我创建了一个全新的空白包,并用它替换了真正的包。它工作正确。我现在确定,只有当包中存在连接管理器时,错误才会出现。这支持了我的理论,即在 32 位模式下,包以某种方式被恶意 SSIS 2005 dll 解析,并且 2008 包中的连接管理器部分与 2005 包中的 xml 有足够大的不同。这只是我的理论。

对我来说毫无意义

可能有些人会建议通过 32 位版本的 DTExec 从命令行运行包。虽然这肯定会起作用(我已经确认了),但这对我来说不是一个解决方案。我需要从进程内的代码中运行包,以便应用程序可以轻松获取和设置包中定义的全局变量。对我来说,从命令行运行包似乎是解决不应该存在的问题的一种解决方法。

有任何想法吗?

答案1

好吧,事实证明这是一个授权或身份问题。我的应用程序在每次请求时都将 Thread.CurrentPrincipal 设置为自定义 IPrincipal 实例。以下是代码的解释:

Public Class AppPrincipal
 Implements IPrincipal

 ...
End Class

...然后在 Global.asax.vb 中

Sub Global_AcquireRequestState(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.AcquireRequestState
    Thread.CurrentPrincipal = New AppPrincipal()
End Sub

我的猜测是,ManagedDTS.dll 程序集将无法打开(或解析)SSIS 包,因为它无法解析“AppPrincipal”身份。这是我的猜测。解决此问题的方法是停止改变 Thread.CurrentPrincipal。

相关内容