共用方式為


建立自己的動作

您可以通過創建稱為 的自定義消息來擴展 Dynamics 365 Customer Engagement (on-premises) 的功能。 這些操作將具有相關的請求/回應類別,並且將生成 Web API 操作。 操作通常用於向組織 Web 服務新增特定領域的功能,或將多個組織 Web 服務的訊息請求合併為單一請求。 例如,在支援呼叫中心,您可能希望將 Create、Assign 和 Setstate 消息合併到一條新的 Escalate 消息中。

某項操作的業務邏輯是通過工作流來實現的。 創建動作時,相關的即時工作流會自動註冊為在執行管道的第 30 階段(核心操作)中執行。 有關即時工作流的更多資訊,請參閱 工作流類型

雖然 Dynamics 365 for Customer Engagement 都支援動作,但只有本地部署和 IFD 部署支援在程式碼中創建動作(使用 XAML)。 在線客戶必須在網頁應用程式中以互動方式建立動作。

 

關於行動定義

操作是透過使用 Workflow 實體記錄來定義的,類似於即時工作流。 以下清單列出了行動是什麼以及它如何運作的一些關鍵點:

  • 可以與單個實體關聯,也可以是全域實體(不與任何特定實體關聯)。

  • 在事件執行流程的核心操作階段 30 中執行。

  • 支援事件執行管線作業前和作業後階段中註冊的外掛程式引動過程。

  • 僅當動作狀態為已啟動時,才能在操作前或操作後階段註冊外掛程式。

  • 可透過 Web API 或 organization.svcorganization.svc/web 端點獲得。

  • 可以使用 JavaScript Web 資源執行。 詳細資訊: 使用 JavaScript Web 資源執行作

  • 始終在呼叫使用者的安全上下文下運行。

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

  • 可以選擇通過配置設置參與當前資料庫事務。

  • 不支援將執行限制為使用者、營業單位或組織的範圍。 操作始終在組織範圍內執行。

  • 支援 input 和 output 參數。

  • 支援資料變更稽核。

  • 離線客戶端不支援。

  • 可透過 Web 服務方法呼叫來叫用。

  • 可以直接從工作流中調用。

所需權限

要啟用某個操作的即時工作流以便執行,必須具有名為 Activate Real-time Processes (prvActivateSynchronousWorkflow) 的安全許可權。 這不包括在建立工作流程所需的任何權限之內。

使用代碼創建動作

通常,動作會由訂製者使用網路應用程式的互動式工作流程設計器來實現。 開發人員可以使用 SDK 調用來實施操作,並根據需要將其部署到本地或 IFD 伺服器。

下表描述了用於某動作的工作流實體屬性。 即時工作流的範例代碼可在主題 在代碼中創建即時工作流中找到。

工作流屬性 說明
Category 設定為 WorkflowCategory.CustomOperation
SyncWorkflowLogOnError true 時,錯誤將記錄在 ProcessSession 中。 與異步工作流不同,即時工作流執行不會被記錄到 System Job
Mode 未使用。
IsTransacted 如果動作需參與資料庫交易,則設定為 true;否則,設定為 false。 預設值為 true
UniqueName 動作的唯一名稱。 該名稱由發行者前綴 + “_” + 唯一名稱組成。
Xaml 設定為定義您動作的即時工作流程的 XAML 程式碼。 無法引用另一個現有的即時工作流。

添加輸入和輸出參數

動作支援使用 DynamicActivityProperty 類型將輸入和輸出參數添加到工作流。 將這些參數添加到作的工作流中時,它們將成為與該作關聯的消息請求和回應類中的屬性。 例如,下面的示例演示兩個 input 參數和一個 output 參數的 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>  

用於屬性的名稱應與參數名稱一致,因為代碼生成會將這些名稱定義為請求或響應屬性。

下表顯示了 input 和 output 參數支援的參數類型。

.NET 類型 引數類型
System.Int32 整數
系統字串 繩子
EntityReference EntityReference
Entity Entity
EntityCollection EntityCollection
System.DateTime 日期時間
System.Double 浮動
System.Decimal 小數點
Money 金錢
System.Boolean 布林值
OptionSetValue Picklist

下表列出了支持的參數屬性。

引數屬性 說明
ArgumentRequiredAttribute 指示參數是否是必需的。
ArgumentDirectionAttribute 指示參數的方向是 input 還是 output。
ArgumentDescriptionAttribute 指定引數的描述。
ArgumentEntityAttribute 需要傳入實體時使用。
ArgumentTargetAttribute 此屬性是自動生成或添加的。 它指的是運行工作流程的主要實體。 此屬性對於全域動作是可選的。

封裝動作以進行散發

若要分發您的作以便可以將其導入到 Dynamics 365 Customer Engagement (on-premises) 組織中,請將您的作添加到 Customer Engagement 解決方案中。 這可以通過導航到 Settings>Customizations>Solutions 來使用 Web 應用程式輕鬆完成。 您還可以編寫代碼來創建解決方案。 有關解決方案的更多資訊,請參閱 打包和分發擴展

產生動作的早期繫結類型

使用 CrmSvcUtil 工具,您可以為您的操作生成請求和回應類,以包含在應用程式代碼中。 不過,產生這些類別之前,請務必啟用動作。

要下載 CrmSvcUtil.exe,請參閱 Dataverse 開發工具

以下示例顯示了工具的格式,該工具可從命令列運行以用於 Customer Engagement 的內部部署。 您需要為安裝提供參數值。

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

以下示例顯示了使用 Dynamics 365 for Customer Engagement 從命令行運行該工具的格式。 您需要提供適用於您的帳戶和伺服器的參數值。

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 中創建新動作。 如果動作是在實體的上下文中創建,就會綁定到該實體。 否則這會是未繫結動作。 詳細資訊: 使用 Web API 操作

使用 JavaScript 網頁資源執行操作

可以使用 Web API 執行動作,就像任何系統動作一樣。 詳細資訊: Xrm.WebApi.online.execute

使用組織服務執行操作

要透過託管代碼來執行組織網路服務的操作,請遵循以下步驟。

  1. 將您使用 CrmSvcUtil 工具生成的早期綁定類型檔包含在應用程式的專案中。

  2. 在您的應用程式代碼中,初始化動作請求並填入所有必需的屬性。

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

    在執行應用程式碼之前,請確保該動作已啟動。 否則,您將收到運行時錯誤。

使用流程執行動作

您可以從工作流程、互動對話或其他流程動作中執行動作。 在 Web 應用程式流程表單的 Add Step 下拉列表中選擇 Perform Action 項,可以使用已啟用的自訂動作。 將步驟添加到流程後,您可以從步驟中提供的Action(動作)清單中選擇新的自定義動作(或任何動作)。 在步驟中選擇 Set Properties 以指定自定義作所需的任何輸入參數。

備註

如果自定義作具有不受支持的參數類型,例如 Picklist、Entity 或 Entity Collection,則自定義作不會列在 Action (作 ) 清單中。

Dynamics CRM Online 2015 Update 1 引入了從流程執行作的功能。

現有 Depth 平臺檢查可確保不會發生無限迴圈。 有關深度限制的更多資訊,請參閱 MaxDepth

注意長時間執行的動作

如果作的即時工作流中的某個步驟是自定義工作流活動,則該自定義工作流活動將在隔離的沙箱運行時環境中執行,並且將受到兩分鐘超時限制的約束,類似於沙箱外掛程式的管理方式。 但是,對於動作本身可以花費的總時間沒有限制。 此外,如果某個動作參與了啟用了回滾功能的事務,則 SQL Server 的超時限制將適用。

小提示

最佳實務建議是,應在 Dynamics 365 Customer Engagement (內部部署) 之外,使用 .NET 的非同步或後台處理程序,來執行長時間運行的操作。

另請參閱

創建即時工作流
使用對話框進行引導式流程
事件執行管道
編寫工作流以自動化業務流程
自訂您的系統