Насколько дорогим является использование MarshalByRefObject по сравнению с сериализацией?

В моем коде роли веб-роли Azure у меня есть класс CustomIdentity, полученный из System.Security.Principal.IIdentity. В какой-то момент .NET runtime пытается сериализовать этот класс и сериализация не будет работать. Попытка решить, что я много искал, и нашел этот ответ и попытался наследовать мой класс из MarshalByRefObject.

Теперь, когда мой класс CustomIdentity наследуется от MarshalByRefObject, попыток сериализации больше не работает, и мой код работает. Однако я хотел бы знать последствия использования класса MarshalByRefObject.

Мой код работает следующим образом. Сначала запрос поступает в IIS и передается в код аутентификации, который создает экземпляр CustomIdentity и присоединяет этот экземпляр к HTTP-контексту. Затем через некоторое время один и тот же HTTP-контекст передается обработчику ASP.NET, который обращается к этому экземпляру CustomIdentity не чаще одного раза. CustomIdentity объект живет на время запроса и затем уничтожается.

Теперь с сериализацией мой CustomIdentity будет сериализован в поток, а затем десериализован из этого потока в новый объект. С MarshalByRefObject не создается сериализация, но создается прокси-сервер, и доступ будет распределяться через RPC, где находится фактический объект.

Насколько дорогим будет использование MarshalByRefObject в этом сценарии? Который - MarshalByRefObject или сериализация - будет более дорогостоящим?

1 ответ

MarshalByRefObject означает, что все вызовы (методы, свойства и т.д.) проксируются по проводу. Это потенциально означает, что вместо передачи данных один раз, а затем запуск нескольких методов и т.д. Локально на переданных данных, вы делаете сетевой вызов при каждом доступе. Сколько раз (по запросу) проверяется роль, например? или имя запрашивается? Я, честно говоря, не знаю, но я предполагаю, что это больше, чем 1 (всего всего). Кроме того, первоначальные затраты на установку...

Полоса пропускания, вероятно, не будет значительной, но задержка очень значительна, особенно если у вас есть распределенные узлы (так как вы упоминаете облачный сценарий).

Лично я бы избегал MarshalByRefObject как чума, но до вас...

licensed under cc by-sa 3.0 with attribution.