名称服务应用程序准则

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

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

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

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

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

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

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

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