如何使用UCMA连接到Skype for Business

时间:2018-07-20 08:14:50

标签: c# .net windows-services skype-for-business ucma

当我从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的原因,但是我不明白它是如何工作的!

3 个答案:

答案 0 :(得分:0)

您不是在谈论UCMA,而是在谈论Lync Client SDK

您可以这样考虑SDK:

  • Lync客户端SDK

此SDK可让您远程控制标准“ Lync客户端”。您可以使用此SDK使用户的Lync Client自动化以执行您可以做的任何事情,或者扩展Lync Client的功能(有一定限制)。要使用此SDK,Lync Client必须在您要自动化/扩展的用户中运行。您不能真正在Windows服务上下文中运行它。

所有Lync Client应用程序还“共享”一个Lync Client“会话”。

可以在“ side by side”模式下运行Lync Client SDK,但是该模式非常有限(即没有UI),并且在大多数情况下没有那么有用。

  • UCMA

此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
           }
}

当然,用户可以通过查看其任务管理器来手动终止该应用程序,但是大多数最终用户却不这样做。