从UCMA应用程序中的电话号码中检索Lync联系人

时间:2014-10-30 14:47:24

标签: c# sip lync ucma

我有一个在Lync 2013 Server上运行并使用MSPL的C#托管应用程序。我将每个来自MSPL的调用路由到应用程序并在那里处理它。 Lync到Lync调用正常,其to标题的格式为sip:user@domain.com。但是,当从网络外部(非移动电话等)到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);

这总是返回一个空结果。如何才能首先检索与电话号码关联的用户以获取其存在?

2 个答案:

答案 0 :(得分:0)

我这样解决了:

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(List // Custom类)。然后我拨打FindContactBySip并检查提供的SIP是否等于用户的电子邮件或电话。

答案 1 :(得分:0)

我找到了另外两种解决问题的方法。

在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地址的电子邮件地址。

另一种方法是使用&#39; P-Asserted-Identity&#39; sip标头以确定电话呼叫路由到/来自谁。唯一的问题是它不会出现在初始邀请中(无论如何都会出现在From侧),而是来自Lync客户端的180响铃响应。

  P-Asserted-Identity: <sip:lync.user@xxx.com>, <tel:+123456789;ext=12345>

所以,如果你等待180响铃响应,那么我建议你使用P-Asserted-Identity方法,你甚至不需要从MSPL中逃脱它!