原文地址:http://blog.greenl.ee/2012/02/22/conversation-objects-for/
为了让开发者尽情的扩展Lync的功能而无需了解SIP协议的本质,UCMA引入了很多抽象类,其中最常用的就是Conversation类。但是对于刚接触UCMA的开发者还有写迷惑,部分原因可能是当你要发送IM或者应答语音呼叫时它的目的不是显而易见的。
下面的代码对于UCMA开发者应该很熟悉:
Conversation conversation = new Conversation(_endpoint); AudioVideoCall avCall = new AudioVideoCall(conversation); avCall.BeginEstablish("sip:user@domain.local", null, OnCallEstablished, avCall); ...
想要创建一个Call对象却不提供Conversation对象是不可能的。所以问题就来了:Conversation对象到底是干嘛的?
答案和Lync的多方式通信有关。耶?你说的“多方式通信”是几个意思啊?当你和另一个哥们正在文字热聊却感觉不够过瘾,于是增加语音聊天到当前窗口中,这就是多方式通信。这样,当Lync给最初存在的会话,比如IM或者其他,发送一个新的 SIP INVITE信息时,里面会保护一个SIP头信息(称为Ms-Conversation-ID),类似于这样:
Ms-Conversation-ID: 2f1a99b1cf19081c425f09a8700679
如果你后来又增加了不同的方式,比如在语音 聊天中增加文件传输,Lync会在SIP INVITE消息中重新使用这个ID。这样这个ID就把不同的通信方式联系在了一起。
在UCMA中Conversation对象就是这样一个可以包含多方式通信的东西。换句话说,Conversation对象管理着一个或多个具有相同会话ID的Call 对象。
刚才的那个例子里,在创建了语音视频通信后如果还想增加文字方式,可以这样:
InstantMessagingCall imCall = new InstantMessagingCall(avCall.Conversation);
这会告诉UCMA你并没有新建一个独立的IM通信,相反你只是增加了IM方式。
希望我理清了Conversation对象的作用。