C# 如何使用UCMA连接到Skype For Business

C# 如何使用UCMA连接到Skype For Business,c#,.net,windows-services,skype-for-business,ucma,C#,.net,Windows Services,Skype For Business,Ucma,当我从Windows服务项目调用LyncClient.Get()时,我遇到了一个问题,因为我知道如果在控制台应用程序上进行测试,它会工作得很好 var lyncClient = LyncClient.GetClient(); Dictionary<PublishableContactInformationType, object> statusData = new Dictionary<PublishableContac

当我从Windows服务项目调用
LyncClient.Get()
时,我遇到了一个问题,因为我知道如果在控制台应用程序上进行测试,它会工作得很好

 var lyncClient = LyncClient.GetClient();
            Dictionary<PublishableContactInformationType, object> statusData =
                new Dictionary<PublishableContactInformationType, object>
                {
                    {PublishableContactInformationType.LocationName, _position},
                    {PublishableContactInformationType.Availability, ContactAvailability.Busy}
                };
var lyncClient=lyncClient.GetClient();
字典状态数据=
新词典
{
{PublishableContactInformationType.LocationName,_position},
{PublishableContactInformationType.Availability,ContactAvailability.Busy}
};
我得到的例外是:

Microsoft.Lync.Model.ClientNotFoundException:主机进程未运行 在Microsoft.Lync.Model.LyncClient.Ensurei()上 到Microsoft.Lync.Model.LyncClient.GetClient(布尔sideBySideLync)

在进行研究时,我读到在Windows服务中,我们无法通过调用GetClient()获取Lync客户端,因为服务进程和Lync进程处于不同的会话中,这就是为什么我尝试使用UCMA或UCWA,但我不了解它是如何工作的

你不是在谈论,你是在谈论未来

您可以这样认为SDK:

  • Lync客户端SDK
此SDK允许您远程控制标准的“Lync客户端”。您可以使用此SDK自动运行Lync客户端,以便用户执行您可以执行的任何操作或扩展Lync客户端的功能(有点有限)。要使用此SDK,Lync客户端必须在您希望自动化/扩展的用户中运行。您不能在windows服务上下文中真正运行它

此外,所有Lync客户端应用程序“共享”一个Lync客户端“会话”

有一个选项可以在“”模式下运行Lync Client SDK,但该模式非常有限(即没有UI),并且在大多数情况下没有多大用处

  • UCMA
此SDK是SIP端点SDK。它允许您创建和使用两种主要类型的SIP端点:

  • 用户端点
  • 受信任的应用程序终结点
使用sip端点,您几乎可以完成Lync客户端SDK在自动化Lync客户端时可以完成的所有操作(即拨打电话、接听电话、设置状态、订阅状态更改等)。有一些限制,没有视频通话支持。使处理某些情况更加困难

UCMA允许您创建“受信任的应用程序”,允许您创建用于扩展S4B基础设施的sip端点。“受信任的应用程序”/“受信任的应用程序终结点”在S4B中是“受信任的”,并且可以执行简单UCMA应用程序(如IVR)通常无法执行的操作

所以,这取决于您试图做什么,取决于您应该使用什么SDK

UCMA应用程序可以在windows服务应用程序中使用

是UCMA的web SDK版本(某种类型)。UCWA比UCMA SDK的局限性大得多,但UCWA适用于Skype for Business Online,而UCMA不直接与Skype for Business Online合作。您可以使用federation让UCMA与Skype for Business Online一起工作,但这需要将本地S4B设置与Skype for Business Online联合起来,这需要大量工作

更新: 要回答评论问题,位置是“”的一部分。因此,设置位置需要做的是使用位置设置当前状态。有关UCWA,请参阅有关设置的MSDN链接。下面的示例中,更改您使用到“”href的链接,并发布如下内容:

{"location":"my new location"}

我在应用程序中尝试做的是更改skype用户在服务中的位置。由于无法使用Lync Client SDK,我必须使用UCWA SDK,但我找不到一个可以遵循他的示例,这是一个建议

您为什么要使用服务进行此操作?您可以使用一个小型控制台应用程序来完成这项工作,该应用程序将在后台运行且不可见,并在会话启动时启动。 这样,您就不需要知道用户的登录名/密码,您只需在代码中轮询,等待Skype for Business client启动(我假设在会话启动后不久启动)

以下是我的意思的一个例子:

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

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

我在应用程序中尝试的是更改skype用户在服务中的位置。由于无法使用Lync Client SDK,我必须使用UCWA SDK,但我找不到一个可以遵循他的示例,这是一个建议@迪达你说的“改变立场”是什么意思?AFAIK S4B中称为“位置”的用户没有此类数据。你指的是用户的“状态”还是“位置”、“状态”等“状态”子数据?我指的是位置,我创建了一个程序,可以自动识别公司内部人员的位置。所以我创建了一个服务来检索位置并在skype上更新它!