当我从Windows服务项目中调用LyncClient.Get()
时遇到问题,因为知道如果我在控制台应用程序上进行测试,它会很好地工作。
var lyncClient = LyncClient.GetClient();
Dictionary<PublishableContactInformationType, object> statusData =
new Dictionary<PublishableContactInformationType, object>
{
{PublishableContactInformationType.LocationName, _position},
{PublishableContactInformationType.Availability, ContactAvailability.Busy}
};
我得到的异常是:
Microsoft.Lync.Model.ClientNotFoundException:主机进程未运行 在Microsoft.Lync.Model.LyncClient.EnsureOI() 到Microsoft.Lync.Model.LyncClient.GetClient(Boolean sideBySideLync)
进行研究时,我读到Windows服务中的内容,因为服务进程和Lync进程处于不同的会话中,所以我们无法通过调用GetClient()获得Lync客户端,这就是为什么我要使用UCMA或UCWA的原因,但是我不明白它是如何工作的!
答案 0 :(得分:0)
您不是在谈论UCMA,而是在谈论Lync Client SDK。
您可以这样考虑SDK:
此SDK可让您远程控制标准“ Lync客户端”。您可以使用此SDK使用户的Lync Client自动化以执行您可以做的任何事情,或者扩展Lync Client的功能(有一定限制)。要使用此SDK,Lync Client必须在您要自动化/扩展的用户中运行。您不能真正在Windows服务上下文中运行它。
所有Lync Client应用程序还“共享”一个Lync Client“会话”。
可以在“ side by side”模式下运行Lync Client SDK,但是该模式非常有限(即没有UI),并且在大多数情况下没有那么有用。
此SDK是SIP端点SDK。它允许您创建和使用两种主要类型的SIP端点:
使用sip端点,您可以完成Lync Client SDK在自动化Lync Client时可以执行的几乎所有工作(即拨打电话,接听电话,设置状态,订阅状态更改等)。有一些限制,不支持视频通话。使得处理某些情况更加困难。
UCMA允许您创建“受信任的应用程序”,以允许您创建用于扩展S4B基础结构的sip端点。 “受信任的应用程序” /“受信任的应用程序终结点”在S4B中是“受信任的”,并被允许执行通常用简单的UCMA应用程序无法完成的工作。 IVR
因此,这取决于您要执行的操作取决于您应使用的SDK。
UCMA应用程序可以在Windows服务应用程序中使用。
UCWA是UCMA的Web SDK版本(实物)。与UCMA SDK相比,UCWA的局限性要大得多,但是UCWA可用于Skype for Business Online,而UCMA不能直接与Skype for Business Online合作。您可以使用联合身份验证使UCMA与Skype for Business Online一起使用,但这需要将本地S4B设置与Skype for Business Online联合,这是很多工作。
更新: 为了回答评论问题,位置是“ presence”的一部分。因此,设置位置所需要做的就是设置一个位置的当前状态。对于UCWA,请参阅有关设置presence的MSDN链接。按照该示例,将您使用的链接更改为“ location” href,并发布如下内容:
{"location":"my new location"}
答案 1 :(得分:0)
我要在应用程序中执行的操作是从服务更改Skype用户的位置。由于无法使用Lync Client SDK进行此操作,因此我必须使用UCWA SDK,但找不到适合我的示例,一个建议!
答案 2 :(得分:0)
您为什么要使用服务?您可以使用一个小型控制台应用程序来做到这一点,该应用程序将在后台运行且不可见,并在会话启动时启动。 这样,您无需知道用户的登录名/密码,只需要轮询代码即可等待Skype for Business客户端启动(我认为这将在会话启动后不久)
这是我的意思的示例:
class Program
{
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("Kernel32")]
private static extern IntPtr GetConsoleWindow();
const int SW_HIDE = 0;
static void Main(string[] args)
{
// Let's hide the console window first ...
IntPtr hwnd;
hwnd = GetConsoleWindow();
ShowWindow(hwnd, SW_HIDE);
// I recommend you start a separate thread from here, I removed it for the sake of simplicity
Boolean clientConnected = false;
while (!clientConnected)
{
try
{
LyncClient lyncClient = LyncClient.GetClient();
clientConnected = true;
// Do your stuff here...
}
catch (ClientNotFoundException ex)
{
// Client not found : the client is probably not running...
// There is nothing to do besides wait and expect to have the user starting his client...
clientConnected = false; // not needed, just to highlight the fact that we are not connected yet
}
// Don't forget to make your application sleep/do nothing on regular intervals to avoid taking 100% CPU time while you are polling
}
}
当然,用户可以通过查看其任务管理器来手动终止该应用程序,但是大多数最终用户却不这样做。