分享
 
 
 

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

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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://im.example.com/instmsg/aliases/deriks

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>HTTP/1.1 200 OK</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://im.example.com/instmsg/aliases/deriks

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>HTTP/1.1 200 OK</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/instmsg/aliases/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

此示例说明在 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

ACL

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有