演练:创建 UII Web 应用程序适配器

 

发布日期: 2016年11月

适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2013,Dynamics CRM 2015,Dynamics CRM 2016

如果需要增强和修改您无法访问源代码,或没有权限使用托管代码更改的 Web 应用程序,您可以创建 Web 应用程序适配器。Microsoft Dynamics 365 提供了创建 Web 应用程序适配器所需的 Microsoft Visual Studio 模板。 该模板以注释形式提供基本代码,以帮助您创建 Web 应用程序适配器,快速入门并上手。

在此演练中,您将创建一个名为 QsWebApplication 的外部 Web 应用程序,并将其托管至 Unified Service Desk内。 您随后将为外部 Web 应用程序创建和配置一个名为 MyWebApplicationAdapter 的 Web 应用程序适配器,以便与 Unified Service Desk交互。 该 Web 应用程序拥有四个标签,每个标签均包含客户的名字、姓氏、地址和 ID 和四个相应的文本框,以显示 Unified Service Desk 值。

本主题内容

必备条件

步骤 1:创建示例 Web 应用程序

步骤 2:配置 Dynamics 365 中的 Web 应用程序

步骤 3:测试 Web 应用程序

步骤 4:创建 Web 应用程序适配器

步骤 5:配置 Dynamics 365 中的 Web 应用程序适配器

步骤 6:测试 Web 应用程序适配器

必备条件

  • Microsoft .NET Framework 4.5.2 项

  • Unified Service Desk 客户端应用程序;是测试托管控件所需的应用程序。

  • Microsoft Visual Studio 2012、Visual Studio 2013 或 Visual Studio 2015

  • 适用于 Visual Studio 2012Visual Studio 2013Visual Studio 2015 的 NuGet Package Manager

  • Microsoft Dynamics 365 SDK 包括 UII 托管控件项目模板的 Visual Studio 的模板。 您可以使用下列方式之一获取模板:

步骤 1:创建示例 Web 应用程序

  1. 下载 UII SDK 包 (.exe)

  2. 双击包文件以提取内容。

  3. 导航至 <ExtractedFolder>\UII\SampleCode\UII\AIF\QsWebApplication 文件夹,并打开 Microsoft.Uii.QuickStarts.QsWebApplication.csproj 文件(位于 Visual Studio内)。

  4. 按 F5 或选择“调试”>“开始调试”,将示例 Web 应用程序托管至本地计算机上。 将在 https://localhost:2627/ 上托管该应用程序。

    Visual Studio 中的 Web 应用程序

步骤 2:配置 Dynamics 365 中的 Web 应用程序

  1. 登录到 Microsoft Dynamics 365。

  2. 转到“设置”>“Unified Service Desk”。

  3. 选择“托管控件”。

  4. 选择“新建”。

  5. 在“新托管控件”页面中,指定下列值。

    字段

    客户

    QsWebApplication

    USD 组件类型

    CCA 托管应用程序

    托管应用程序

    Web 托管应用程序

    应用程序是全局的

    已检查

    显示组

    MainPanel

    适配器

    不使用适配器

    应用程序是动态的

    应用程序宿主

    使用 SetParent

    URL

    指定 Web 应用程序的托管位置。 在此服务案例中,为 https://localhost:2627/。

    Dynamics 365 中 Web 应用程序配置的屏幕截图

  6. 选择“保存”。

步骤 3:测试 Web 应用程序

  1. 确保您在步骤 1 内创建的示例 Web 应用程序仍在运行。

  2. 运行Unified Service Desk客户端,以连接到您的 Microsoft Dynamics 365 服务器。

  3. 成功登录后,您将会在桌面上看到“示例外部 Web 应用程序”。

  4. 单击“示例外部 Web 应用程序”选项卡以查看您托管在“统一服务台”内的 Web 应用程序。

在 Unified Service Desk 中托管 Web 应用程序

备注

此时,由于您仅将外部 Web 应用程序托管至“统一服务台”内,因此字段为空。 若要使用“统一服务台”内的数值进行填充,则我们必须如下步所示创建 Web 应用程序适配器。

步骤 4:创建 Web 应用程序适配器

  1. 启动 Microsoft Visual Studio 并创建一个新项目。

  2. 在“新项目”对话框中:

    1. 从位于左侧的已安装模板列表中,展开 Visual C#,并选择“Dynamics 365 SDK 模板”>“Unified Service Desk”>“UII Web 应用程序适配器”。

    2. 指定项目的名称和位置,然后单击“确定”以创建新项目。

      Visual Studio 中的 Web 适配器屏幕截图

    3. 选择 WebAppAdapter.cs 并使用以下代码更新 NotifyContextChange 的定义,以使用上下文信息填充文本字段。详细信息:NotifyContextChange

      public override bool NotifyContextChange(Context context)
              {
                  // Populating text fields from context information.
      
                  HTMLDocument htmlDoc = Browser.Document as HTMLDocument;
                  if (htmlDoc != null)
                  {
                      IHTMLElementCollection htmlElementCollection = htmlDoc.all;
                      IHTMLElement htmlFirstName = htmlElementCollection.item("txtFirstName", 0) as IHTMLElement;
                      htmlFirstName.setAttribute("value", context["firstname"], 0);
                      IHTMLElement htmlLastName = htmlElementCollection.item("txtLastName", 0) as IHTMLElement;
                      htmlLastName.setAttribute("value", context["lastname"], 0);
                      IHTMLElement htmlAddress = htmlElementCollection.item("txtAddress", 0) as IHTMLElement;
                      htmlAddress.setAttribute("value", context["address1_line1"], 0);
                      IHTMLElement htmlID = htmlElementCollection.item("txtID", 0) as IHTMLElement;
                      htmlID.setAttribute("value", context["CustomerID"], 0);
                  }
                  return base.NotifyContextChange(context);
              }
      
    4. 添加以下代码,以替代 DoAction 的定义,并使用 Unified Service Desk 内的数值更新应用程序

      public override bool DoAction(HostedWebApplication.WebAction action, ref string data)
              {
                  Trace.WriteLine(string.Format("{0}>>>>> RECEIVED (WebAction) Action : {1} ", this.Name, action.Name));
      
                  // Check to see if the browser is working on something before allowing the system to do 'normal' behavior.
                  if (Browser.WebBrowser.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
                  {
                      // Browser is not in a state to process this request,  Queue it for when the browser is ready to handle it. 
                      Trace.WriteLine(string.Format("{0}>>>>> Browser Busy,({2}) Queuing Action : {1} ", this.Name, action.Name, Browser.WebBrowser.ReadyState.ToString()));
                      qReqActionList.Enqueue(new BrowserActionData(action, data));
                      return false;
                  }
                Trace.WriteLine(string.Format("{0}>>>>>>>>>>> Action:Name={1} Action:Url={2} Action:Query={3} Action:Init={4}", this.Name, action.Name, action.Url, action.QueryString, action.Initialization));
      
                  // Get browser DOM and element collection.
                  // Create an XML Document to load the passed in data to.
                  HTMLDocument htmlDoc = Browser.Document as HTMLDocument;
                  IHTMLElementCollection htmlElementCollection = htmlDoc.all;
      
                  // Check action name for something we know how to process.
                  switch (action.Name)
                  {
                      case "UpdateFirstName":
                          IHTMLElement htmlFirstName = htmlElementCollection.item("txtFirstName", 0) as IHTMLElement;
                          htmlFirstName.setAttribute("value", data, 0);
                          break;
                      case "UpdateLastName":
                          IHTMLElement htmlLastName = htmlElementCollection.item("txtLastName", 0) as IHTMLElement;
                          htmlLastName.setAttribute("value", data, 0);
                          break;
                      case "UpdateAddress":
                          IHTMLElement htmlAddress = htmlElementCollection.item("txtAddress", 0) as IHTMLElement;
                          htmlAddress.setAttribute("value", data, 0);
                          break;
                      case "UpdateID":
                          IHTMLElement htmlID = htmlElementCollection.item("txtID", 0) as IHTMLElement;
                          htmlID.setAttribute("value", data, 0);
                          break;
                  }
                  return false;
              }
      
    5. 保存您的项目,并生成项目(“生成”>“生成解决方案”)。 项目成功生成之后,程序集(MyWebApplicationAdapter.dll)会随即在项目文件夹内的 \bin\debug 文件夹内生成。 您随后将需要使用此程序集来测试和使用您的 Web 应用程序适配器。

步骤 5:配置 Dynamics 365 中的 Web 应用程序适配器

  1. 登录到 Microsoft Dynamics 365。

  2. 在导航栏上,选择“Microsoft Dynamics 365”,然后选择“设置”。

  3. 选择 “设置”>“统一服务台”>“托管控件”。

  4. 在托管控制列表中,选择 QsWebApplication 托管控件。

    Dynamics 365 中的托管控件列表

  5. 在“适配器配置”区段内,指定以下数值。

    字段

    适配器

    使用适配器

    URI

    MyWebApplicationAdapter

    类型​​

    MyWebApplicationAdapter.WebAppAdapter

    Dynamics 365 的 Web 适配器配置

备注

URI 是指您的程序集名称,而“类型”是指您的程序集 (dll) 名称,后跟点号 (.) 和您的 Visual Studio 项目内的类别名称。 在此示例中,程序集名称为 MyWebApplicationAdapter,类别名称为 WebAdapter,该类别名称是您创建 Web 应用程序适配器时的默认类别名称。

  1. 选择“保存”以保存您所做的更改。

步骤 6:测试 Web 应用程序适配器

  1. 将您的 Visual Studio 项目输出文件夹 (<ProjectFolder>\bin\debug)内包含 Web 应用程序适配器定义的程序集复制并粘帖到统一服务台应用程序目录内。 在这种情况下,您需将 MyWebApplicationAdapter.dll 文件复制并粘帖到 c:\Program Files\Microsoft Dynamics CRM USD\USD 目录内。

  2. 运行 Unified Service Desk 客户端连接到 Microsoft Dynamics 365 服务器。

  3. 成功登录后,您将会在桌面上看到示例外部 Web 应用程序。

  4. 选择“搜索”,然后选择“联系人”,以选择一名联系人。 在这种情况下,选择 Patrick Sands

    联系人列表屏幕截图

  5. 单击“示例外部 Web 应用程序”,您即可看到填充的客户名字、姓氏、地址和 ID。

    测试 WebApp 适配器屏幕截图

备注

本演练详细说明了您应如何读取或查看外部 Web 应用程序内的 Unified Service Desk 的数据。 若要使用外部 Web 应用程序更新 Unified Service Desk 内的数据,反之亦然,请参阅 演练:创建 UII Windows 窗体托管控件

另请参阅

使用 UII 适配器与外部和 Web 应用程序互动

Unified Service Desk 2.0

© 2017 Microsoft。 保留所有权利。 版权