События и делегаты удаленного взаимодействия .NET Framework
Этот раздел относится к технологии прежних версий, которая сохраняется для обеспечения обратной совместимости с существующими приложениями и не рекомендуется для разработки новых приложений. Сейчас распределенные приложения следует создавать с помощью Windows Communication Foundation (WCF).
Хотя при удаленном взаимодействии .NET можно использовать события и делегаты, для их успешного использования необходимо решить две основных проблемы. В частности их следует использовать только тогда, когда применяется проверка подлинности по каналу IpcChannel.
Использование делегатов
Удаленные делегаты создают проблему безопасности, которую необходимо решать. Если клиент передает серверу делегат (чаще всего это происходит, когда клиент прикрепляет обработчик к удаленному событию), прикрепляемый делегат может ссылаться на неавторизованный метод, у которого может быть та же подпись, что и у требуемого метода. Поскольку подписи требуемого и нетребуемого методов совпадают, служба может вызвать нетребуемый метод, даже если он является статическим (а следовательно не может быть вызван на удаленном клиенте).
Чтобы избежать этого, сервер должен определять делегаты с параметрами пользовательских типов, а сборка, содержащая эти типы, должна иметь строгое имя. Более того, всегда необходимо проверять подлинность (или даже шифровать) соответствующие операции обмена данными. Никогда не следует допускать десериализации типа не сервере, если нет уверенности, что это требуемый тип.
Использование событий
Принимая во внимание проблемы безопасности, связанные с делегатами, использовать события не рекомендуется. Вместо этого следует определить службу обратного вызова клиента, публикующую методы, которые служба может вызывать, если ей требуется обратиться к клиенту. Если принято решение использовать удаленные события при проверке подлинности IpcChannel (и объявлены делегаты, как описано выше), методы обработчика событий клиента должны быть односторонними вызовами. Это связано с тем, что при создании событий сервер вызывает делегаты в списке вызова событий. Система событий блокируется этим вызовом, пока клиент не вернет ответ или не истечет время ожидания. Клиенты, которые не ожидают передачи данных, значительно снижают производительность простых событий, если только обработчик событий не является односторонним методом.