共用方式為


建立自己的動作

 

發行︰ 2017年1月

適用於: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

您可以建立稱為動作的自訂訊息,擴充 Microsoft Dynamics 365 的功能。 這些動作關聯將會有相關聯的要求/回覆類別,而且也將會產生 Web API 動作。 動作一般用來新增網域特定功能至組織 Web 服務,或組合多個組織 Web 服務訊息要求至單一要求。 例如,在支援客服中心,您可能想要合併 Create、Assign 和 Setstate 訊息至單一新的 Escalate 訊息。

使用工作流程,實作動作的商務邏輯。 當您建立動作時,相關即時工作流程會自動註冊,以便在執行管線的階段 30 (核心作業) 中執行。 如需即時工作流程的詳細資訊,請參閱Dynamics 365 程序類別

雖然 Microsoft Dynamics 365 (線上和內部部署) 都支援動作,但是只有內部部署和 IFD 部署支援以程式碼 (使用 XAML) 建立動作。 Online 客戶必須在 Web 應用程式以互動方式建立動作。

本主題內容

關於動作定義

所需權限

使用程式碼,建立動作

封裝要發佈的動作

產生動作的早期繫結類型

使用 Web API 執行動作

使用偵錯服務執行動作

使用程序執行動作

留意長時間執行的動作

關於動作定義

透過使用 Workflow 實體記錄來定義動作,類似於即時工作流程。 以下列出何謂動作及其運作方式的一些重點:

  • 可以與單一實體相關聯或是全域 (未與任何特定實體相關聯)。

  • 是在事件執行管線的核心作業階段 30 中執行。

  • 支援叫用在事件執行管線的前置作業和後置作業階段中註冊的外掛程式。

  • 只有在動作狀態為已啟用時,才能在前置作業或後置作業階段中註冊外掛程式。

  • 透過 organization.svc 和 organization.svc/web 端點可供使用,但不透過 organizationdata.svc (OData) 端點。

  • 使用 JavaScript Web 資源,可執行。其他資訊:使用 JavaScript Web 資源,執行動作

  • 永遠是在呼叫使用者的安全性內容下執行。

  • 在動作上註冊外掛程式的步驟時,記錄無法刪除。

  • 透過組態設定,可選擇性地,參與目前資料庫交易。

  • 不支援執行限制為使用者、業務單位或組織的範圍。 動作一律在組織範圍中執行。

  • 支援輸入或輸出引數。

  • 支援稽核資料變更。

  • 不支援離線用戶端。

  • 可以由 Web 服務方法呼叫叫用。

  • 可以直接從工作流程叫用。

所需權限

需要名為「啟用即時程序」(prvActivateSynchronousWorkflow) 的安全性權限,才能啟用動作的即時工作流程,使其可執行。 這是除了建立工作流程所需權限之外的權限。 如需這些權限的詳細資訊,請參閱 自訂索引標籤 中的權限 UI 對應。

使用程式碼,建立動作

一般而言,使用 Web 應用程式互動工作流程設計工具,由自訂員實作動作。 如果需要,開發人員可使用 SDK 呼叫實作動作和部署至內部部署或 IFD。

下表描述動作使用的工作流程實體屬性。 即時工作流程範例程式碼可在主題 使用程式碼建立即時工作流程中找到。

工作流程屬性

描述

Category

設定為 WorkflowCategory.CustomOperation

SyncWorkflowLogOnError

true,錯誤會記錄到 ProcessSession 記錄。 不同於非同步工作流程,即時工作流程不會記錄到 System Job 記錄。

Mode

未使用。

IsTransacted

若動作必須參與資料庫交易,請設定為 true,否則為 false。 預設值為 true

UniqueName

動作的唯一名稱。 名稱是由發行者首 +「_」+ 唯一名稱所組成。

Xaml

設定為可定義動作的即時工作流程的 XAML 程式碼。 無法參照其他現有即時工作流程。

新增輸入和輸出引數

動作支援輸入和輸出引數新增至使用類型 DynamicActivityProperty 的工作流程。 當您新增這些引數至動作的工作流程時,會變成與該動作相關聯訊息要求和回覆類別中的屬性。 例如,下列範例顯示兩個輸入參數與一個輸出引數的 C# 和 XAML 程式碼。

DynamicActivityProperty inputProperty1 = new DynamicActivityProperty     { Name = "Subject", Type = typeof(InArgument<string>) };
DynamicActivityProperty inputProperty2 = new DynamicActivityProperty     { Name = "EntityCollection", Type = typeof(InArgument<EntityCollection>) };
DynamicActivityProperty outputProperty1 = new DynamicActivityProperty     { Name = "Output", Type = typeof(OutArgument<string>) };

inputProperty1.Attributes.Add(new ArgumentRequiredAttribute(true));
inputProperty1.Attributes.Add(new ArgumentDescriptionAttribute("The subject"));
inputProperty1.Attributes.Add(new ArgumentDirectionAttribute(Microsoft.Xrm.Sdk.Workflow.ArgumentDirection.Input));

inputProperty2.Attributes.Add(new ArgumentRequiredAttribute(false));
inputProperty2.Attributes.Add(new ArgumentDescriptionAttribute("The entity collection"));
inputProperty2.Attributes.Add(new ArgumentDirectionAttribute(Microsoft.Xrm.Sdk.Workflow.ArgumentDirection.Input));

outputProperty1.Attributes.Add(new ArgumentRequiredAttribute(false));
outputProperty1.Attributes.Add(new ArgumentDescriptionAttribute("The output"));
outputProperty1.Attributes.Add(new ArgumentDirectionAttribute(Microsoft.Xrm.Sdk.Workflow.ArgumentDirection.Output));
<x:Property Name="Subject"
            Type="InArgument(x:String)">
 <x:Property.Attributes>
  <mxsw:ArgumentRequiredAttribute Value="True" />
  <mxsw:ArgumentTargetAttribute Value="False" />
  <mxsw:ArgumentDescriptionAttribute Value="The subject " />
  <mxsw:ArgumentDirectionAttribute Value="Input" />
  <mxsw:ArgumentEntityAttribute Value="" />
 </x:Property.Attributes>
</x:Property>
<x:Property Name="EntityCollection"
            Type="InArgument(mxs:EntityCollection)">
 <x:Property.Attributes>
  <mxsw:ArgumentRequiredAttribute Value="False" />
  <mxsw:ArgumentTargetAttribute Value="False" />
  <mxsw:ArgumentDescriptionAttribute Value="The entity collection" />
  <mxsw:ArgumentDirectionAttribute Value="Input" />
  <mxsw:ArgumentEntityAttribute Value="" />
 </x:Property.Attributes>
</x:Property>
<x:Property Name="Output"
            Type="OutArgument(x:String)">
 <x:Property.Attributes>
  <mxsw:ArgumentRequiredAttribute Value="False" />
  <mxsw:ArgumentTargetAttribute Value="False" />
  <mxsw:ArgumentDescriptionAttribute Value="The output" />
  <mxsw:ArgumentDirectionAttribute Value="Output" />
  <mxsw:ArgumentEntityAttribute Value="" />
 </x:Property.Attributes>
</x:Property>

因為程式碼產生會定義這些名稱是要求或回覆屬性,用於屬性的名稱應該與引數名稱一致。

下表中顯示輸入或輸出引數支援的引數類型。

.NET 類型

引數類型

System.Int32

Integer

System.String

String

EntityReference

EntityReference

Entity

Entity

EntityCollection

EntityCollection

System.DateTime

DateTime

System.Double

Float

System.Decimal

Decimal

Money

Money

System.Boolean

Boolean

OptionSetValue

Picklist

下表中列出支援的引數屬性。

引數屬性

描述

ArgumentRequiredAttribute

表示引數是否為必要。

ArgumentDirectionAttribute

表示引數方向是輸入或輸出。

ArgumentDescriptionAttribute

指定引數的描述。

ArgumentEntityAttribute

如果您想要傳入實體時使用。

ArgumentTargetAttribute

此屬性自動產生或新增。 其指向工作流程執行的主要實體。 此屬性對全域動作是選擇性。

封裝要發佈的動作

若要發佈動作,以便匯入 Microsoft Dynamics 365 組織,請將動作新增至 Dynamics 365 解決方案。 使用 Web 應用程式,瀏覽至 [設定] > [自訂] > [解決方案],輕鬆執行此操作。 您也可以撰寫程式碼建立解決方案。 如需解決方案的詳細資訊,請參閱使用解決方案,封裝與發佈擴充功能

產生動作的早期繫結類型

使用 SDK 套件提供的 CrmSvcUtil 工具,您即可產生動作的要求和回覆類別,以包括在您的應用程式碼。 不過,產生這些類別之前,請務必啟用動作。

下載 Microsoft Dynamics CRM SDK 套件。

下列範例顯示從命令列執行 Dynamics 365 的內部部署安裝工具的格式。 您提供安裝時使用的參數值。

    CrmSvcUtil.exe /url:http://<serverName>/<organizationName>/XRMServices/2011/Organization.svc /out:<outputFilename>.cs /username:<username> /password:<password> /domain:<domainName> /namespace:<outputNamespace> /serviceContextName:<serviceContextName> /generateActions

下列範例顯示使用 Microsoft Dynamics 365 (線上) 從命令列執行此工具的格式。 您需要提供適用於公司客戶與伺服器的參數值。

    CrmSvcUtil.exe /url:https://<organizationUrlName>.api.crm.dynamics.com/XRMServices/2011/Organization.svc /out:<outputFilename>.cs /username:<username> /password:<password> /namespace:<outputNamespace> /serviceContextName:<serviceContextName> /generateActions

請注意 /generateActions 參數的使用。其他資訊:使用程式碼產生工具 (CrmSvcUtil.exe) 建立早期繫結實體類別

您可以使用早期繫結類型或晚期繫結類型與針對動作產生的要求和回覆類別。

使用 Web API 執行動作

新動作在建立時是以 Web API 所建立。 如果動作是在實體內容中建立,就會繫結至該實體。 否則是未繫結的動作。其他資訊:使用 Web API 動作

使用偵錯服務執行動作

使用 Managed 程式碼,若要使用組織 Web 服務執行動作,請執行下列步驟。

  1. 包含早期繫結類型檔案 (使用應用程式專案的 CrmSvcUtil 工具產生的)。

  2. 用您的應用程式碼,具現化您的動作要求並填入所有必要屬性。

  3. 叫用 Execute,並傳送您的要求做為引數。

在執行您的應用程式碼之前,請確定動作已啟用。 否則,您會收到執行階段錯誤。

使用 JavaScript Web 資源,執行動作

就像任何系統動作一樣,動作可以使用 Web API 來執行。其他資訊:使用 Web API 動作

Sdk.Soap.js 範例程式庫示範如何搭配使用訊息與 JavaScript Web 資源和組織服務 (organization.svc/web)。 使用伴隨 Sdk.Soap.js 動作訊息產生器範例,產生可與 Sdk.Soap.js 一起使用的 JavaScript 程式庫,同樣地程式庫可以用於該範例中提供的系統訊息。 使用 Sdk.Soap.js 活動功能產生器產生的檔案是每個動作的個別 JavaScript 程式庫。 每個程式庫包含要求和回覆類別,對應至 CrmSvcUtil 產生的類別。

使用程序執行動作

您可以從工作流程、對話方塊或其他程序動作執行動作。 啟動的自訂動作可供程序使用,方法是在 Web 應用程式程序表單的 [新增步驟] 下拉式清單中選取 [執行動作] 項目。 步驟新增至程序之後,您就可以從此步驟中提供的 [動作] 清單選取新的自訂動作 (或任何動作)。 在步驟中選取 [設定屬性] 指定您的自訂動作需要的任何輸入參數。

注意

如果自訂動作有不支援的參數類型,例如 [挑選清單]、[實體] 或 [實體集合],則自訂動作不會列在 [動作] 清單中。

從程序執行動作的功能是在 Microsoft Dynamics CRM Online 2015 更新 1 中導入。

現有的 Depth 平台會檢查以確保不會發生無限迴圈。 如需深度限制的詳細資訊,請參閱 MaxDepth

留意長時間執行的動作

如果動作的即時工作流程步驟為自訂工作流程活動,該自訂工作流程活動是執行於隔離沙箱執行階段環境,而且受制於兩分鐘逾時限制,類似沙箱化外掛程式管理方式。 不過,沒有動作本身所需整體時間的限制。 此外,如果動作參與交易,若回復啟用,SQL Server 逾時適用。

提示

最佳作法建議是,使用 .NET 非同步或背景程序,長時間執行作業應該在 Microsoft Dynamics 365 之外執行。

另請參閱

建立即時工作流程
在 Dynamics 365 中使用對話方塊進行引導式程序
事件執行準銷售案源
使用 Dynamics 365 程序自動化商務程序
TechNet:自訂您的系統

Microsoft Dynamics 365

© 2017 Microsoft. 著作權所有,並保留一切權利。 著作權