名称服务应用程序准则

开发分布式应用程序时,需要为应用程序用户提供一种方法,用于指定他们可以在名称服务数据库中注册应用程序时使用的名称。 此方法可以包含数据文件、命令行输入或对话框。

虽然 RPC 名称服务体系结构支持各种方法来组织应用程序的服务器条目,但它已针对查找进行了优化。 因此,频繁更新可能会妨碍名称服务和应用程序的性能。 为了避免不必要地导出信息,请选择允许服务器确定其信息是否在名称服务数据库中的设计。 此外,每个服务器实例都应导出为自己的条目名称。 否则,实例将很难在不干扰另一个实例的信息的情况下更改其支持的对象 UUID 或协议序列。

无论网络使用什么名称服务,以下方法都避免了这些缺陷并提供良好的性能。

首先,请设计应用程序,以便在给定服务器实例首次启动时选取唯一的服务器条目名称,并将此名称连同应用程序的其他配置信息一起保存在注册表中。 然后,让其绑定句柄和对象 UUID(如果有)导出到其名称服务条目。

服务器实例的后续调用应检查名称服务条目存在,并且包含一组正确的对象 UUID 和绑定句柄。 缺少条目可能意味着管理员将其删除,或者断电导致名称服务信息丢失。 请务必验证条目中的绑定句柄是否正确;例如,如果管理员向计算机添加 TCP/IP 支持,则 RPC 服务器将在调用 RpcServerUseAllProtseqs 时侦听该协议序列。 但是,如果服务器不更新名称服务条目,则不会通知客户端 TCP 受支持。

客户端导入时,应指定 NULL 作为条目名称。 指定 NULL 会导致 Microsoft RPC 库函数在客户端计算机的域或工作组的所有名称服务条目中搜索接口,从而查找每个实例的信息。

如果使用对象 UUID 来表示已知对象(如打印机),则可以使用此方法的变体。 不要将绑定导出到一个条目,而是设计应用程序,以便每个实例为每个受支持的对象创建一个条目,例如“/.:/printers/Laser1“ 和 ”/.:/printer/Laser2。”然后,让服务器将其绑定句柄导出到每个服务器条目,以及与该条目相关的对象 UUID。

在这种情况下,客户端可以通过从相关服务器条目导入来按名称查找资源;它不需要资源的对象 UUID。 如果它具有资源 UUID,但没有名称,则可以从 null 条目导入。