Удаленные вызовы канала дважды в метод Dispose при удалении объектов SingleCall со стороны клиента - PullRequest
0 голосов
/ 23 сентября 2010

У нас есть много классов, опубликованных на удаленном канале как одиночные вызовы. Приложение находится в службе Windows. Они используются в следующих сценариях:

  1. Из того же домена приложения
  2. Из другого домена приложения с использованием удаленного канала CrossAppDomain
  3. С удаленного клиента через сеть по каналу TCP

Поскольку некоторые из этих классов используются в трех случаях, у нас есть некоторый общий код для работы с ними, например:

using(IRemoteObject remoteObject= (IRemoteObject) 
        RemotingHelper.GetObject(typeof(IRemoteObject)))
{
   remoteObject.DoStuff();
}

RemotingHelper уже знает, как создавать объекты в зависимости от сценария. Это модификация Инго Раммера.

Все интерфейсы удаленных объектов наследуются от IDisposable, а все удаленные объекты наследуются от MarshalByRefObject.

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

Это происходит потому, что вызов Dispose (), который выполняется с помощью оператора с использованием оператора , управляется как новый удаленный вызов, но инфраструктура удаленного взаимодействия уже вызвала к удалению объекта автоматически, потому что Вот как он ведет себя с объектами SingleCall: каждый вызов создает новый экземпляр и автоматически удаляет его.

Есть ли какое-либо значение конфигурации, чтобы избежать этих повторных (избыточных) вызовов?


Редактировать: Я уже знал, почему это произошло. В случае удаленного объекта SingleCall IDisposable канал удаленного взаимодействия автоматически вызывает метод Dispose после возврата метода, второй вызов выполняется прокси-сервером, сгенерированным на стороне клиента, что вызывает создание экземпляра нового объекта на стороне сервера только для вызова метода Dispose. способ.

Этот второй вызов - тот, который я хочу избежать, потому что он не нужен.

1 Ответ

1 голос
/ 23 сентября 2010

Думая об этом больше, я склонен думать, что это правильное поведение.Как я понимаю SingleCall, каждый раз, когда вы вызываете метод объекта, сервер создает новый объект.Поэтому имеет смысл, что несколько объектов создаются и удаляются.То есть этот код:

IRemoteObject remoteObject= (IRemoteObject) 
        RemotingHelper.GetObject(typeof(IRemoteObject));

Создает прокси для объекта на клиенте.Если я правильно помню, с сервером не установлено никакого контакта.

Теперь, когда вы выполняете:

remoteObject.DoStuff();

Удаленный вызов сделан.Сервер создает объект, выполняет метод, возвращает значения (если есть) и удаляет объект.

Затем, когда ваш вызов Dispose (или код, сгенерированный оператором using, делает)сервер делает это снова: создает объект, вызывает метод Dispose и уничтожает объект.

Так работает SingleCall: «Когда вы конфигурируете объект как объект SingleCall,система создает новый объект для каждого вызова метода клиента. "http://msdn.microsoft.com/en-us/library/aa719487(v=VS.71).aspx

Почему это не происходит в ваших сценариях 1 и 2, немного сбивает с толку.

СТАРЫЙ ОТВЕТ:

Я не знаю ни одногопараметр конфигурации, чтобы предотвратить такое поведение.Однако, если вы реализовали метод Dispose в соответствии с рекомендацией , у вас должен быть флаг, указывающий, был ли объект уже удален.Поэтому вызов Dispose несколько раз не должен быть проблемой.

...