Поделиться через


Изменение существующего интерфейса

По возможности реализуйте новый интерфейс для приложения, а не вносите изменения в существующий. Если вы не можете избежать изменения существующего интерфейса, используйте новые типы данных только в новых методах. Введение нового типа данных или изменение существующего типа является наиболее распространенным источником проблем несовместимости. Модель времени выполнения RPC предполагает, что принимающее приложение знает о типах получаемых данных, поэтому данные помещают в сеть без универсального описания данных. Когда получатель ожидает другой тип данных, отличный от того, который отправитель поместил на передачу, заглушка вызывает исключение (или передача завершается сбоем в другом менее корректном режиме).

Интерфейс RPC определяется его UUID, а также номерами основной и дополнительной версий. При изменении существующего интерфейса необходимо добавить новые методы в конце интерфейса и изменить дополнительный номер версии. Если вы добавляете методы в другое место или вносите другие изменения в интерфейс, вам также потребуется изменить основной номер версии.

В реальности бывают случаи, когда вы не можете изменить даже дополнительный номер версии, так как новый клиент не сможет взаимодействовать со старым сервером и вы не можете обновить сервер. Во время выполнения RPC возникает исключение, RPC_S_PROCNUM_OUT_OF_RANGE, когда клиент вызывает метод, превышающий указанный для его интерфейса с сервером. Обходной путь заключается в том, чтобы оставить номера версий без изменений и написать код клиента для корректной обработки этого исключения. Например, клиент снижает его производительность или любым способом, подходящим для вашего приложения.

Существует аналогичный обходной путь для одного особого случая изменения типа данных в существующем методе. При наличии объединения, ветви которого являются указателями и не имеют ветвь по умолчанию для нераспознанных типов, можно добавить новую ветвь, использующая новый тип данных. Это не изменит размер структуры данных. Когда клиент взаимодействует с новым сервером, он может использовать новый тип данных. Однако, когда клиент взаимодействует со старым сервером, время выполнения вызовет исключение RPC_S_INVALID_TAG. Опять же, необходимо написать код клиента, чтобы правильно обработать это исключение.

Интерфейс DCOM определяется по его GUID. В DCOM интерфейсы считаются неизменяемыми, и изменения можно внести только путем создания нового интерфейса, наследуемого от старого. Эти правила гарантируют совместимость клиентов и серверов.