从 UCMA 应用程序中的电话号码检索 Lync 联系人
Posted
技术标签:
【中文标题】从 UCMA 应用程序中的电话号码检索 Lync 联系人【英文标题】:Retrieve Lync contact from a phone number in an UCMA application 【发布时间】:2014-10-30 14:47:24 【问题描述】:我有一个在 Lync 2013 Server 上运行并使用 MSPL 的 C# 托管应用程序。我将每个呼叫从 MSPL 路由到应用程序并在那里处理。 Lync 到 Lync 的呼叫工作正常,它们的 to
标头采用 sip:user@domain.com
的形式。但是当从网络外部(非 lync,如手机等)向 Lyncuser 的工作电话发起呼叫时,Uri 就像sip:+12341234@domain.com;user=phone
(sip:[workphone]@domain)。将此字符串传递给 Presence Retrieval 函数不起作用。
var sips = new string[] phone ; // The "To" number
presenceService.BeginPresenceQuery(sips, categories, null, null, null);
这总是返回一个空的结果。如何首先检索与电话号码关联的用户以获取其存在?
【问题讨论】:
当您说“来自外部来源的呼叫”时,这个外部来源是联邦网络吗?如果外部源只是电话而不是 lync/skype/etc 客户端,那么无论您做什么,它都不存在。 我的意思是来自网络外的电话或移动电话的呼叫。我自己已经找到了一个“解决方案”,但我希望有更好的解决方案。 【参考方案1】:我是这样解决的:
public static UserObject FindContactBySip(string sip)
return UserList.FirstOrDefault(u => u.HasSip(sip));
private static void InitFindUsersInAD()
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
var user = new UserPrincipal(ctx);
user.Name = "*";
var searcher = new PrincipalSearcher(user);
var result = searcher.FindAll();
var sipList = new List<string>();
UserList = new List<UserObject>();
foreach (var res in result)
var underlying = (DirectoryEntry)res.GetUnderlyingObject();
string email = string.Empty, phone = string.Empty, policies = string.Empty;
foreach (var keyval in underlying.Properties.Values)
var kv = keyval as System.DirectoryServices.PropertyValueCollection;
if (kv != null && kv.Value is string)
if (kv.PropertyName.Equals("msRTCSIP-PrimaryUserAddress"))
email = (kv.Value ?? string.Empty).ToString();
else if (kv.PropertyName.Equals("msRTCSIP-Line"))
phone = (kv.Value ?? string.Empty).ToString();
else if (kv.PropertyName.Equals("msRTCSIP-UserPolicies"))
policies = (kv.Value ?? string.Empty).ToString();
if (!string.IsNullOrEmpty(phone) && !string.IsNullOrEmpty(email))
var userobj = new UserObject(email, phone, policies);
UserList.Add(userobj);
首先,我从 AD 初始化 UserList
(列表 // 自定义类)。然后我拨打FindContactBySip
并检查提供的SIP 是否等于用户的电子邮件或电话。
【讨论】:
【参考方案2】:我找到了另外两种解决问题的方法。
在 MSPL 中,您可以:
toContactCardInfo = QueryCategory(toUserUri, 0, "contactCard", 0);
这给了你:
<contactCard xmlns=""http://schemas.microsoft.com/2006/09/sip/contactcard"" >
<identity >
<name >
<displayName >
Lync User</displayName>
</name>
<email >
lync.user@xxx.com</email>
</identity>
</contactCard>
您可以将电子邮件地址转换为 sip 地址。这仅在您的 lync 设置使用电子邮件地址作为 sip 地址时才有效。
另一种方法是使用 'P-Asserted-Identity' sip 标头来确定电话呼叫被路由到/来自谁。唯一的问题是它没有出现在初始邀请中(因为无论如何都会出现在 From 端),而是出现在 Lync 客户端的 180 响铃响应中。
P-Asserted-Identity: <sip:lync.user@xxx.com>, <tel:+123456789;ext=12345>
因此,如果您等待 180 响铃响应,那么我建议您使用 P-Asserted-Identity 方法,您甚至不需要为此逃离 MSPL!
【讨论】:
以上是关于从 UCMA 应用程序中的电话号码检索 Lync 联系人的主要内容,如果未能解决你的问题,请参考以下文章