从 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 联系人的主要内容,如果未能解决你的问题,请参考以下文章

UCMA设置lync在线状态

Lync 2010 UCMA 3.0 SDK - 呼叫转移

如何访问 UCMA 3.0 SDK 中的 Lync 2010 白板功能?

使用 Lync 自动调用应用程序

UCMA 应用程序未连接到 Lync 服务器

适用于 Lync 的 UCC API 到 UCMA 3.0