0

我有一个在 Lync 2013 Server 上运行并使用 MSPL 的 C# 托管应用程序。我将每个呼叫从 MSPL 路由到应用程序并在那里处理。Lync 到 Lync 的调用工作正常,它们的toHeader 格式为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);

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

4

2 回答 2

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

于 2014-11-06T07:32:52.997 回答
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 地址时才有效。

另一种方法是使用“ P-Asserted-Identity ” sip 标头来确定电话呼叫被路由到/来自谁。唯一的问题是它没有出现在初始邀请中(因为无论如何都将出现在 From 端),而是出现在 Lync 客户端的 180 响铃响应中。

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

因此,如果您等待 180 响铃响应,那么我建议您使用 P-Asserted-Identity 方法,您甚至不需要为此逃离 MSPL!

于 2015-03-30T00:43:21.670 回答