ApplicationManager.CreateObject не может загрузить сборку в новом домене приложений - PullRequest
0 голосов
/ 04 марта 2010

Я пытаюсь разработать веб-приложение, которое отправляет (Dispatcher) нескольким версиям другого веб-приложения для каждого отдельного запроса. С этой целью я использую ApplicationManager.CreateObject для создания новых доменов приложений, на которых запущено соответствующее веб-приложение, но новые домены приложений, похоже, не могут загрузить DLL диспетчера (и я копирую DLL находится в каталоге bin веб-приложения, поэтому я почти уверен, что он есть).

var version = "version";
var path = @"C:\code\devel\webapp";

// Copy host assembly to target webapp so that 'Host' is available
var assembly = Assembly.GetExecutingAssembly().Location;
var target = path + "\\bin\\" + Path.GetFileName(assembly);
File.Copy(assembly, target, true);

var manager = ApplicationManager.GetApplicationManager();
var obj = manager.CreateObject(version, typeof(Host), "/", path, true, true);

Вот журнал слияния:

Assembly manager loaded from:  c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Running under executable  C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\9.0\WebDev.WebServer.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = FOOBAR\aaron
LOG: DisplayName = Dispatcher, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Program Files (x86)/Common Files/Microsoft Shared/DevServer/9.0/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Common Files/Microsoft Shared/DevServer/9.0/Dispatcher.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Common Files/Microsoft Shared/DevServer/9.0/Dispatcher/Dispatcher.DLL.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Common Files/Microsoft Shared/DevServer/9.0/Dispatcher.EXE.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/Common Files/Microsoft Shared/DevServer/9.0/Dispatcher/Dispatcher.EXE.

Кажется, что база данных указывает на корень сервера разработки, а не на путь, переданный в ApplicationManager.CreateObject, и это только поиск в каталогах под сервером разработки, что кажется странным. Любые идеи о том, как заставить новый AppDomain искать библиотеку DLL в корне веб-приложения, а не на сервере разработки?

1 Ответ

2 голосов
/ 08 марта 2010

Похоже (по крайней мере, в нашей ситуации), что это неправильный путь: использование обратного прокси - правильный путь.

Обратные прокси-серверы имеют то преимущество, что они являются «шаблоном» в архитектуре HTTP, и они избавляют нас от необходимости убедиться, что среда выполнения ASP.NET действительно правильно настроена в доменах приложений, работающих в реальной сети. приложение.

В настоящее время мы рассматриваем ProxyMachine , который является настраиваемым обратным прокси-сервером TCP, и GitHub, похоже, добился определенного успеха с .

...