У нас есть много классов, опубликованных на удаленном канале как одиночные вызовы. Приложение находится в службе Windows. Они используются в следующих сценариях:
- Из того же домена приложения
- Из другого домена приложения с использованием удаленного канала CrossAppDomain
- С удаленного клиента через сеть по каналу TCP
Поскольку некоторые из этих классов используются в трех случаях, у нас есть некоторый общий код для работы с ними, например:
using(IRemoteObject remoteObject= (IRemoteObject)
RemotingHelper.GetObject(typeof(IRemoteObject)))
{
remoteObject.DoStuff();
}
RemotingHelper уже знает, как создавать объекты в зависимости от сценария. Это модификация Инго Раммера.
Все интерфейсы удаленных объектов наследуются от IDisposable, а все удаленные объекты наследуются от MarshalByRefObject.
Таким образом, в случае использования этого кода в первых двух случаях код ведет себя корректно, но при использовании в режиме реального удаленного взаимодействия удаленный объект создается дважды и удаляется дважды.
Это происходит потому, что вызов Dispose (), который выполняется с помощью оператора с использованием оператора , управляется как новый удаленный вызов, но инфраструктура удаленного взаимодействия уже вызвала к удалению объекта автоматически, потому что Вот как он ведет себя с объектами SingleCall: каждый вызов создает новый экземпляр и автоматически удаляет его.
Есть ли какое-либо значение конфигурации, чтобы избежать этих повторных (избыточных) вызовов?
Редактировать: Я уже знал, почему это произошло. В случае удаленного объекта SingleCall IDisposable канал удаленного взаимодействия автоматически вызывает метод Dispose после возврата метода, второй вызов выполняется прокси-сервером, сгенерированным на стороне клиента, что вызывает создание экземпляра нового объекта на стороне сервера только для вызова метода Dispose. способ.
Этот второй вызов - тот, который я хочу избежать, потому что он не нужен.