O pacote falhou ao carregar devido ao erro 0xC0011008 Erro ao carregar de XML

2

Ambiente:

  • Windows Server 2008 SP2 Enterprise Edition de 64 bits

  • SQL Server 2008 SP3 Standard Edition de 64 bits

  • Anteriormente, tinha o Integration Services do SQL Server 2005 Developer Edition de 32 bits. Isso foi desinstalado agora.

  • ASP.NET v4

  • IIS 7

Nossos aplicativos ASP.NET precisam executar pacotes SSIS no processo usando o assembly ManagedDTS.dll. Estamos desenvolvendo pacotes SSIS no BIDS 2008 (em oposição a 2005) para que possamos importar / exportar arquivos do Excel 2007-2010. Nossos aplicativos ASP.NET estão sendo desenvolvidos na compilação do Visual Studio .NET 2010 para o código do .NET Framework 4. Eu estou fazendo referência a seguinte versão do ManagedDTS.dll na minha máquina de desenvolvimento do Windows 7 de 32 bits.

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

Implementamos nossos aplicativos em um servidor Windows 2008 de 64 bits. O IIS 7 nesse servidor é usado para alternar a execução de nossos aplicativos no modo de 32 ou 64 bits.

Quando executamos o aplicativo no modo de 64 bits e executamos o pacote do SSIS, o pacote faz analisar corretamente. No entanto, ele fornece um erro de tempo de execução que nos informa que o Gerenciador de conexões do Excel não é suportado na versão de 64 bits do SSIS. Esse não é o problema que estou precisando corrigir agora.

O problema real está em executar o pacote enquanto o aplicativo está sendo executado no modo de 32 bits. Execução lança uma exceção não tratada que fornece essa mensagem de erro:

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.

Essa mensagem de erro me faz pensar que, de alguma forma, o pacote está sendo analisado pelo analisador xml do SSIS 2005. Isso não deveria ser possível, já que eu desinstalei totalmente o SSIS 2005.

Pouco de informação interessante

Então, criei um novo pacote em branco e substituí o pacote real por ele. funcionou corretamente. Eu determinei agora que o erro se manifesta apenas quando um Connection Manager está presente no pacote. Isso suporta minha teoria de que de alguma forma no modo de 32 bits os pacotes estão sendo analisados por uma dll do SSIS 2005, e a seção do Gerenciador de Conexões em 2008 é xml suficientemente diferente de seus equivalentes de 2005. Apenas minha teoria.

Nonstarter para mim

Provavelmente, algumas pessoas sugerirão executar o pacote a partir da linha de comando por meio da versão de 32 bits do DTExec. Enquanto isso certamente funcionaria (eu confirmei), isso não é uma solução para mim. Eu preciso executar o pacote do código em processo para que o aplicativo possa obter e definir facilmente as variáveis globais definidas no pacote. Executar o pacote a partir da linha de comando, para mim, parece uma solução para um problema que não deveria existir.

Alguma idéia?

    
por Chad Braun-Duin 10.12.2011 / 18:42

1 resposta

1

Bem, acontece que isso foi uma questão de autorização ou identidade. Meu aplicativo estava definindo Thread.CurrentPrincipal como uma instância IPrincipal personalizada em cada solicitação. Abaixo está uma paráfrase do código:

Public Class AppPrincipal
 Implements IPrincipal

 ...
End Class

... Então, no Global.asax.vb

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

Minha conjectura é que o assembly ManagedDTS.dll falharia em abrir (ou analisar) o pacote do SSIS, já que ele não poderia resolver a identidade "AppPrincipal". Esse é o meu palpite. A correção para isso era simplesmente parar de alterar o Thread.CurrentPrincipal.

    
por 04.01.2012 / 16:04