Окружающая среда:
Windows Server 2008 SP2 Enterprise Edition 64-разрядная.
SQL Server 2008 SP3 Standard Edition 64-разрядная.
Ранее был SQL Server 2005 г. 32-разрядные службы интеграции Developer Edition. Теперь это было удалено.
ASP.NET v4
IIS 7
Наши приложения ASP.NET должны выполнять пакеты SSIS в процессе с использованием сборки ManagedDTS.dll. Мы разрабатываем пакеты SSIS в BIDS 2008 (в отличие от 2005), чтобы мы могли импортировать / экспортировать файлы Excel 2007-2010. Наши приложения ASP.NET разрабатываются в Visual Studio .NET 2010 и компилируются в код .NET Framework 4. Я имею в виду следующую версию ManagedDTS.dll на моем 32-разрядном компьютере для разработки под управлением Windows 7.
C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll
Мы развертываем наши приложения на 64-битном сервере Windows 2008. IIS 7 на этом сервере используется для переключения запуска наших приложений в 32-разрядном или 64-разрядном режиме.
Когда мы запускаем приложение в 64-битном режиме и выполняем пакет SSIS, пакет делает разобрать правильно. Однако это дает ошибку времени выполнения, которая сообщает нам, что диспетчер подключений Excel не поддерживается в 64-разрядной версии SSIS. Однако это не та проблема, которую мне нужно решать прямо сейчас.
Настоящая проблема заключается в выполнении пакета, когда приложение работает в 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.
Это сообщение об ошибке заставляет меня думать, что каким-то образом пакет анализируется анализатором xml SSIS 2005. Это невозможно, поскольку я полностью удалил SSIS 2005.
Итак, я создал новый, пустой пакет и заменил им настоящий пакет. Это работал правильно. Теперь я определил, что ошибка проявляется только тогда, когда в пакете присутствует диспетчер соединений. Это подтверждает мою теорию о том, что каким-то образом в 32-битном режиме пакеты анализируются мошеннической dll SSIS 2005, а раздел Connection Manager в пакетах 2008 года существенно отличается от xml от их аналогов 2005 года. Просто моя теория.
Возможно, кто-то предложит запустить пакет из командной строки через 32-битную версию DTExec. Хотя это, безусловно, сработает (я это подтвердил), это не решение для меня. Мне нужно запустить пакет из кода в процессе, чтобы приложение могло легко получать и устанавливать глобальные переменные, определенные в пакете. Для меня запуск пакета из командной строки кажется обходным решением проблемы, которой не должно быть.
Любые идеи?
Что ж, оказывается, это была проблема с авторизацией или идентификацией. Мое приложение настраивало 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.