ASP.NET - IIS7 - проблема IBM DB2

Я работаю над сайтом ASP.NET, который вызывает базу данных DB2. У меня есть Visual Studio, установленная на сервере Windows 2008, где будет размещен сайт. Когда я отлаживаю сайт в Visual Studio, используя встроенный веб-сервер, я могу подключиться к базе данных, и сайт работает нормально. Когда я устанавливаю сайт в IIS7 на том же сервере, я не могу получить доступ к сайту или базе данных из-за следующей ошибки.

Вот технические подробности:

Windows 2008 Server
IIS 7
Visual Studio 2010 Premium
DB2 v9.5.301.436

Could not load file or assembly 'IBM.Data.DB2' or one of its dependencies. An attempt was made to load a program with an incorrect format. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.BadImageFormatException: Could not load file or assembly 'IBM.Data.DB2' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Assembly Load Trace: The following information can be helpful to determine why the assembly 'IBM.Data.DB2' could not be loaded.

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog]. 

Stack Trace: 

[BadImageFormatException: Could not load file or assembly 'IBM.Data.DB2' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) +567
   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +192
   System.Reflection.Assembly.Load(String assemblyString) +35
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +118

[ConfigurationErrorsException: Could not load file or assembly 'IBM.Data.DB2' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +11424435
   System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +484
   System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() +127
   System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +334
   System.Web.Compilation.BuildManager.CallPreStartInitMethods() +280
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +1167

[HttpException (0x80004005): Could not load file or assembly 'IBM.Data.DB2' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11556592
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4813333

Я не понимаю, как сайт может нормально работать с веб-сервером Visual Studio и не работать в IIS. Я не знаю, была ли проблема IIS или проблема с версией IMB.Data.DB2.dll, которую я использую. Если у кого-то есть решение или какие-то идеи, они будут очень признательны.

Спасибо.

Ответ 1

Чтобы выполнить эту работу, мне пришлось зайти в диспетчер IIS, щелкнуть пул приложений node, щелкнуть пул приложений для сайта, а затем нажать дополнительные настройки в правой части экрана. Затем я изменил Enable 32-разрядные приложения на true.

Это исправило мою проблему, и сайт работает правильно.

Ответ 2

По какой-то причудливой причине Visual Studio 2012 (и позже) всегда копирует 32-разрядную версию файла IBM.Data.DB2.dll в вашу папку bin, хотя это не требуется, потому что эта DLL является зарегистрированной GAC, когда DB2 Connect установлен.

Самое простое решение - добавить post-build script, чтобы удалить эту DLL из папки bin после каждой сборки. Таким образом, IIS сможет найти правильную версию (независимо от того, нужна ли она 32-разрядная или 64-разрядная версия зависит от настроек AppPool) в GAC.

Ответ 3

Похоже, что версия .NET Framework неверна в вашем AppDomain. В настройках AppDomain убедитесь, что выбранная версия .Net-рамки соответствует версии вашей сборки IBM.Data.DB2.