Дистанционная работа и пропускающий канальные приемники

Я столкнулся с исключением дистанционной работы:

"Этот прокси дистанционной работы не имеет никакого канального приемника, что означает, что или сервер не имеет никаких зарегистрированных каналов сервера, которые слушают, или это приложение не имеет никакого подходящего клиентского канала, чтобы говорить с сервером".

Причина лучше всего объяснена этой записью в блоге, которую я нашел:

Второй случай более неясен. Это происходит, где клиент звонит на сервер, сервер возвращает ссылку на объект, и клиент затем делает запрос к ссылочному объекту на сервере. Если ссылочный объект находится во вторичном AppDomain на сервере, вышеупомянутое исключение может быть выдано. Если проблема происходит, это - потому что регистрация канала только относится к AppDomain, в котором называют RegisterChannel, и никакой канал не был зарегистрирован во вторичном AppDomain. Ссылка на объект вернулась к клиентским вопросам к объекту во вторичном AppDomain, не к его прокси в основном AppDomain, и таким образом, нет никакого канала между клиентом и вторичным AppDomain, через который вызов может передать. Решение: зарегистрируйте канал во вторичном AppDomain, в котором существует ссылочный объект.

Это действительно соответствует моему сценарию, поскольку у меня есть сервис, который загружает плагины в отдельный appdomains. Экземпляры объектов (реализации интерфейса, определенного в блоке, на который ссылаются все блоки), созданы во вторичном appdomains и сосланы сервисом (перекрестно-appdomain, таким образом, сервис имеет ссылки прокси). Сервис затем возвращает эти ссылки прокси на приложение. Существуют зарегистрированные каналы между приложением и сервисом, но ничем между плагином и приложением.

Я думал, что прокси будет достаточно для пересечения appdomain границ. Я должен действительно создать каналы между плагинами и приложением? Это не кажется правильным вообще, таким образом, я должен пропускать что-то.

6
задан redman 1 November 2009 в 18:13
поделиться

1 ответ

Для того, чтобы использовать удаленность по аппдоменам на объектах, производных от MarshalByRefObject, необходимо создавать каналы на обоих концах. Таким образом, необходимо создавать каналы в каждом из апдоменов. Существуют эффективные каналы для этого локально на одной машине, например, канал IPC (использует именованные трубы).

Если связь "односторонняя", в том смысле, что только одна из сторон вызывает методы на прокси, то здесь вы регистрируете клиентский канал, а канал сервера - на стороне, которая создает объекты.

В случае, если нужно идти в обе стороны, например, передавать лог-объект "серверу" для получения непрерывной лог-обратной связи, необходимо зарегистрировать канал сервера на обоих концах, т.к. клиент вдруг также обслуживает объекты:

class MyLogger : MarshalByRefObject
{
    public Log(string text) { ... }
}

MyLogger logger = new MyLogger();
proxyObj.LongRunningCommand(logger);
2
ответ дан 17 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: