基于WPF+XMPP的IM程序开发日志 之三:用户头像Avatar
在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:
看来底层协议的理解还是必不可少的,虽然有类库的帮助,但是了解根本的东西才是理解类库的最好保证。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构