在XMPP中對用戶頭像的支持定義在兩個擴展協議中:
EXP-0153:基於電子名片的頭像
EXP-0084:用戶頭像
好像還有一個擴展協議用於頭像,但忘記了是什么了,ags的官網論壇突然間訪問不了。但EXP-0084好像支持不是很廣泛,agsXMPP支持了,但是Openfire不支持,我在agsXMPP中新建了一個AvatarIq,發送后,得到Openfire的回應IQ錯誤是Service-Unavailable,代碼片段:AvatarIq avatarIq = new AvatarIq();
avatarIq.To = " test@mypc ";
avatarIq.From = " test2@mypc ";
avatarIq.Id = " avatar_id_001 ";
_xmppConn.Send(avatarIq)
得到的回應IQ為:
<iq xmlns="jabber:client" from="test@mypc" to="test@mypc" type="error" id="avatar_id_001"><query xmlns="jabber:iq:avatar" /><error code="503" type="cancel"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" /></error></iq>
而且好像ags的論壇的ALEX也說最好使用EXP-0153的avatar方式。
於是改成使用 :
viq.To = new Jid("test2@mypc");
viq.From = new Jid("test@mypc");
viq.Id = "id_00010";
viq.Type = IqType.get;
_xmppConn.Send(viq);
果然返回的就是一個Vcard的IQ。這里根據XEP-0153定義的,Photo中間的BINVAL節就是用戶頭像的base64編碼內容,解碼出來就是用戶頭像,或者Photo.Image本身就是一個System.Drawing.Imaging.Image對象。
另外,由於對XMPP不是很熟練,在使用IQ的時候, 發送了IQ,但卻沒有觸發xmppClientConnection對象的OnIq事件,后來查看RFC3920協議關於IQ的描述部分,發現自己沒有設置ID和type:
看來底層協議的理解還是必不可少的,雖然有類庫的幫助,但是了解根本的東西才是理解類庫的最好保證。