我有一个在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);
这总是返回一个空结果。如何才能首先检索与电话号码关联的用户以获取其存在?
答案 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中逃脱它!