RVP:存在和即时消息传送协议 (3)

2000年12月09日 02:29:00

PROPFIND

PROPFIND DAV 方法用来获取节点的属性。属性包含 PRESENCE INFORMATION 的一些元组(相关值的集合),如在线状态或所代表的 PRINCIPAL 的显示名称。 对于 RVP,PROPFIND 方法用来从其它 PRINCIPALS 各自的本地服务器上获取其在线状态。此方法还可以用来提取 RVP 实现可能保持的其它属性,如存储在服务器上的永久联系人列表。

PROPFIND 方法检索在所请求的 URL 上定义的属性。PRESENTITY 提交 REQUEST 方法主体中的 propfind XML 元素,此元素说明正在请求的信息。请求特定的属性值、所有属性值或者资源属性名称的列表都是可能的。PRESENTITY 必须提交至少具有一个属性的主体。

如果在检索属性时出现错误,则在响应中必须包括一个相应的错误结果。请求检索一个不存在的属性值是一个错误,并且必须加以记录。如果响应使用一个多状态 XML 元素,则必须返回一个包含 404 Not Found (未找到)状态值的 XML 元素。

每个响应 XML 元素都必须包含一个 href XML 元素,它标识在其上定义了 prop XML 元素中的属性的那个资源。作为一个平面列表返回对具有内部成员的资源的 PROPFIND 请求的结果,此列表中项的次序并不重要。

虽然 DAV 允许 PROPFIND 请求的深度为 0、1 或“无穷大”,其中“无穷大”是缺省值,但是 RVP 要求深度标头为零。这是由于以分布方式实现名称空间时支持其它深度有困难所造成的。如果深度标头不存在或者深度参数不为零,则 RVP PRESENCE SERVICES 会返回状态代码:412 -Precondition Failed(先决条件失败)。

示例

以下示例说明如何检索 RVP PRESENTITY 的显示名属性。

          <
   
   <请求 propfind instmsg aliases deriks http 1.1 host: im.example.com rvp-notifications-version: 0.2 rvp-from-principal: http: depth: 0 content-type: text xml content-length: xxxx>
    
    ?xml version="1.0" ?<           >D:propfind xmlns:D="DAV:"           xmlns:Z="http://schemas.microsoft.com/rvp/"<                >D:prop<                        >D:displayname/<                >/D:prop<           >/D:propfind<                      <
    
    <响应 http 1.1 207 multi-status content-type: text xml content-length: xxxx rvp-notifications-version: 0.2>
     
     ?xml version="1.0" ?<           >D:multistatus xmlns:D="DAV:"           xmlns:Z="http://schemas.microsoft.com/rvp/"<                >D:response<                        >D:href<                               http://im.example.com/instmsg/aliases/deriks                        >/D:href<                        >D:propstat<                                >D:prop<                                        >D:displayname<                                                 Derik Stenerson                                         >/D:displayname<                                >/D:prop<                                >D:status
     
     
      
      /D:status<                        >/D:propstat<                >/D:response<           >/D:multistatus<            
     
     
    
    
   
   

PROPPATCH

PROPPATCH DAV 方法用来设置节点的属性。对于 RVP,此方法可以用来设置 PRESENCE SERVICE 上 PRINCIPAL 的在线状态,或者设置 RVP 系统保持的其它属性。例如,当一个 PRESENTITY “登录”时,PRESENTITY 向 PRESENTITY 的本地服务器发出一个 PROPPATCH 请求,要求将在线状态属性设置为“在线”。

RVP 引入了租用属性的概念。租用属性值会在一段超时过后自动复位为缺省值。在实现合作者列表的在线状态时可以使用它们。例如,PRESENTITY 的在线状态可以将自身复位为离线状态,除非它被刷新。这在客户机崩溃、网络失败或其它必须将 PRESENTITY 状态复位为离线的情况下有用。

尽管 RVP 实现可能禁止租用特定的属性值,但是所有的 RVP 属性都可以具有租用值。PRESENTITIES 获取和设置租用值的方式与处理常规 DAV 属性的方式相同;由 PRESENCE SERVICE 负责识别和解释租用值并强制执行其行为。如果所请求的超时是 RVP PRESENCE SERVICE 的管理策略所不允许的,则 RVP PRESENCE SERVICE 可能拒绝设置属性值。

XML 架构允许在 PROPPATCH 请求和响应中指定一个视图标识符元素,因为某个节点可能有多个 PRESENTITIES 设置属性(即从多台机器登录的用户)。此规范允许将状态更改复制到所有 PRESENTITIES 中,并且允许某些状态是某个 PRESENTITY 所特有的。例如,如果一个 PRINCIPAL 让多个 PRESENTITIES 登录,则任何状态更改为 "busy"(繁忙) 或 "out to lunch"(出去就餐)将导致所有的 PRESENTITIES 都得到此状态更改的通知。然而,如果某个 PRESENTITY 变为离线的或空闲的,则其它的 PRESENTITY 不会得到此状态更改的通知,并且 PRINCIPAL 在不同的 PRESENTITY 上仍然保持在线。

当 PROPPATCH 请求不包含视图标识符时,一个成功的响应会包含一个。此标识符对租用属性和指定此视图标识符的任何后续 PROPPATCH 请求是唯一的。如果具有该视图标识符的所有租用属性到期,则该标识符不再有效,也不应该使用它。

示例

以下示例将一个 RVP PRESENTITY 的在线状态值设置为在线,时间间隔是一小时。除非该属性随后由 PRESENTITY 复位,否则 PRESENCE SERVICE 会在一小时后将在线值转变回离线。

          <
   
   <请求: proppatch instmsg aliases deriks http 1.1 host: im.example.com rvp-notifications-version: 0.2 rvp-from-principal: http: content-type: text xml content-length: xxxx>
    
    ?xml version="1.0"?<           >D:propupdate xmlns:D="DAV:"           xmlns:Z="http://schemas.microsoft.com/rvp/"<                >D:set<                        >D:prop<                                >Z:state<                                        >Z:leased-value<                                                >Z:value<                                                >Z:online/<                                                >/Z:value<                                                >Z:default-value<                                                >Z:offline/<                                                >/Z:default-value<                                                >Z:timeout<3600>/Z:timeout<                                        >/Z:leased-value<                                >/Z:state<                        >/D:prop<                >/D:set<           >/D:propertyupdate<                      <
    
    <响应: http 1.1 207 multi-status rvp-notifications-version: 0.2 content-type: text xml content-length: xxxx>
     
     ?xml version="1.0"?<           >D:multistatus xmlns:D="DAV:"           xmlns:Z="http://schemas.microsoft.com/rvp/"<                >D:response<                        >D:href<                               http://im.example.com/instmsg/aliases/deriks                        >/D:href<                        >D:propstat<                                >D:prop<                                        >Z:state<                                                >Z:leased-value<                                                        >Z:value<                                                                >Z:online/<                                                        >/Z:value<                                                        >Z:default-value<                                                               >Z:offline/<                                                        >/Z:default-value<                                                        >D:timeout<                                                                3600                                                        >/D:timeout<                                                >/Z:leased-value<                                                >Z:view-id<3577>/Z:view-id<                                        >/Z:state<                                >/D:prop<                                >D:status
     
     
      
      /D:status<                        >/D:propstat<                >/D:response<           >/D:multistatus<            
     
     
    
    
   
   

实现的考虑事项

RVP PRESENTITY 使用 PROPPATCH 方法以及租用值将其在线状态属性保持为在线。PRESENTITY 使用一些超时值(即 t),使 PRESENCE SERVICE 在经过 t 之后从在线状态属性转变回离线。

如果 PRINCIPAL 继续在 PRESENTITY 上登录,则 PRESENTITY 应该通过在 t 到期之前发出另一个 PROPPATCH 请求,并就属性获得时间间隔为 t 的新租用,以便刷新在线状态属性。因此,如果 t=30 分钟,则 PRESENTITY 应该在大约 29 分钟时发出另一个 PROPPATCH 请求。否则,如果 PRESENTITY 在 30 分钟时发出一个 PROPPATCH 请求,则新的 PROPPATCH 请求可能会在第一次租用到期之后到达 PRESENCE SERVICE。在这种情况下,PRINCIPAL 在线状态的任何订阅者(即在其联系人列表上有此 PRINCIPAL 的所有 WATCHERS )可能获得虚假的通知 — 一个发布给正在注销的 PRINCIPAL,而紧接着的另一个则发布给再次登录的 PRINCIPAL。

几个考虑事项确定应该使用的正确 t 值。如果 PRESENTITY 是 OUT OF CONTACT((失去联系,即 PRESENTITY 计算机崩溃),则 PRESENCE SERVICE 将无法知道 PRESENTITY 已经崩溃,并且在租用到期之前,PRINCIPAL 的在线状态属性一直保持在线。因此,即使 PRINCIPAL 处于离线状态,t 也会限制 WATCHERS 继续将 PRINCIPAL 视为“在线”的时间间隔。将 WATCHER 的联系人列表的状态保持为“新的”,要求 t 较小 — 理想的情况是接近于零。

然而,如果 PRINCIPAL 已登录,则 PRESENTITY 必须重新发出 PROPPATCH 请求,其时间间隔小于 t,以便保持在线状态。因此,每个登录的 PRESENTITY 都会消耗 PRESENCE SERVICE 的资源,因为 PRESENTITY 有效地 "ping" PRESENCE SERVICE,其时间间隔小于 t。甚至在空闲状态下,这也会产生网络通信量。如果一个 PRESENCE SERVICE 上登录了成千上万的 PRESENTITIES,则此负载可以是相当大的。要使 ping 负载得到控制,请将 t 设置为尽可能大的值,以便每个 PRINCIPAL 的经验都不会降级。

注: Exchange 2000 Server Instant Messaging 使用的 ping 时间间隔为 20 分钟。

NOTIFY

RVP NOTIFY 方法,取自 GENA,将异步通知发送到 RVP 节点 — 即通知接收器。当一个 WATCHER A 通过本地服务器向另一个 PRINCIPAL B 上的属性更改发出 SUBSCRIBE 请求时,WATCHER A 会接收到 PRINCIPAL B 上的属性更改的 NOTIFY 请求。

注: 请求主体中的通知 XML 元素包含通知数据。

在不建立较早订阅的情况下也可以发出 NOTIFY 消息。例如,假定具有正确的访问控制权限,则任何实体都可以将 NOTIFY 消息发送到一个组节点(如 http://im.example.com/groups/rec-cycling);组节点无须向任何其它节点发出 SUBSCRIBE 请求。

在一个 intranet 中,NOTIFY 消息通常由本地服务器用来将通知发送到它们的 INSTANT INBOXES。NOTIFY 消息也由 PRESENCE SERVICES 用来将它们托管的 PRESENTITIES 的在线状态更改发送到其它 PRESENCE SERVICES。

因为 NOTIFY 消息的发件人可能要求确认发送,所以一旦完成了发送就会发出成功响应。为了确定 NOTIFY 消息的发件人何时对完成发送和要求确认满意,会出现一个新的 RVP-Ack-Type 标头。此标头可以包含以下字段。

  • SingleHop 只是在最初收件人(即本地服务器)接收 NOTIFY 消息时,发件人才请求确认。

  • DeepOr 发件人仅在最终目标之一接收到 NOTIFY 时才请求确认。此用法的一个示例是,当用户将一个 INSTANT MESSAGE 发送给委托人或者打印机缺纸时,要求系统管理员之一得到通知。

  • DeepAnd 发件人仅在所有最终目标接收到 NOTIFY 消息时才请求确认。此用法的一个示例是,消息被发送到一个组或分发列表,且有多个 WATCHERS 正在等待 NOTIFY 消息。

此外,在 NOTIFY 请求中,另一个标头是 RVP-Hop-Count。这是一个基于 1 的值,指定为产生此请求已经发生了多少次转发。

客户机- <服务器 rvp-hop-count="1

服务器- <服务器 rvp-hop-count="2

服务器- <客户机 rvp-hop-count="3

NOTIFY 方法使用新的 RVP XML 元素:message、propnotification、notification-from、notification-to、contact、description、msgbody 和 mime-data。

示例

此示例说明 PRESENTITY http://im.example.com/instmsg/aliases/deriks 如何将即时消息发送到 INSTANT INBOX http://im.acmewidgets.com/instmsg/aliases/maxb。

          <
     
     <请求 notify instmsg aliases maxb http 1.1 host: im.acmewidgets.com rvp-notifications-version: 0.2 rvp-ack-type: deepor rvp-hop-count: 1 rvp-from-principal: http: im.example.com deriks content-type: text xml content-length: xxxx>
      
      ?xml version="1.0"?<           >D:notification xmlns:D="DAV:"           xmlns:Z="http://schemas.microsoft.com/rvp/"<                >Z:message<                        >Z:notification-from<                                >Z:contact<                                        >D:href<                                             http://im.example.com/instmsg/aliases/deriks                                       >/Z:href<                                        >Z:description<                                                Derik Stenerson                                        >/Z:description<                                >/Z:contact<                        >/Z:notification-from<                        >Z:notification-to<                                >Z:contact<                                        >D:href<                      http://im.acmewidgets.com/instmsg/aliases/maxb>/D:href<                                        >Z:description<                                                max                                        >/Z:description<                                >/Z:contact<                        >/Z:notification-to<                        >Z:msgbody<                                >Z:mime-data<                                        >![CDATA[MIME-Version: 1.0                                        Content-Type: text/plain;                                        charset=UTF-8                                        X-MMS-IM-Format:                                        FN=Microsoft%20Sans%20Serif; EF=;                                        CO=0; CS=0; PF=22                                        Session-Id: {79FC61B5-1234-1234-                                       8A10-941F33CA4C90}                                                                                Let's have lunch                                        ]]<                                >/Z:mime-data<                        >/Z:msgbody<                >/Z:message<           >/Z:notification<                      <
      
      <响应 http 1.1 200 successful rvp-notifications-version: 0.2 < code>
     
     

此示例说明在 deriks 登录时 NOTIFY 消息是如何发送给 maxb 的。为了此示例所要达到的目的,PRINCIPAL http://im.example.com/instmsg/aliases/deriks 位于联系人列表 http://im.acmewidgets.com/users/maxb 上,并且 maxb 已经订阅了 deriks 的在线状态。

          <
      
      <请求 notify http 1.1 rvp-hop-count: 2 rvp-notifications-version: 0.2 host: 128.1.1.11 content-length: xxxx content-type: text xml rvp-from-principal: im.example.com>
       
       ?xml version="1.0"?<           >Z:notification xmlns:D="DAV:"           xmlns:Z="http://schemas.microsoft.com/rvp/"<                >Z:propnotification<                        >Z:notification-from<                                >Z:contact<                                        >D:href<                                            http://im.example.com/instmsg/aliases/deriks                                        >/D:href<                                        >Z:description/<                                >/Z:contact<                        >/Z:notification-from<                        >Z:notification-to<                                >Z:contact<                                        >D:href<                                           http://im.acmewidgets.com/instmsg/aliases/maxb                                        >/D:href<                                        >Z:description/<                                >/Z:contact<                        >/Z:notification-to<                        >D:propertyupdate<                                >D:set<                                        >D:prop<                                                >Z:state<                                                        >Z:online/<                                                >/Z:state<                                        >/D:prop<                                >/D:set<                        >/D:propertyupdate<                >/Z:propnotification<           >/Z:notification<                    <
       
       <响应 http 1.1 200 successful rvp-notifications-version:0.2 < code>
      
      

ACL

ACL 方法为 XML 架构提供了一些补充。访问控制列表 (ACL) 用来确定谁可以访问和更新节点上的信息。例如,它限制 WATCHER 查看 PRESENTITY 是否在线的能力。

RVP ACL 的名称空间与 WEBDAV ACL 的稍有不同,因为有几个元素是不需要的,另外又添加了几个新元素。名称空间是 http://schemas.microsoft.com/rvp/acl/



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3226


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值