建立自己的動作
發行︰ 2016年11月
適用於: Dynamics CRM 2015
您可以建立稱為動作的自訂訊息,擴充 Microsoft Dynamics 365 的功能。 這些動作有關聯的要求/回覆類別。 現在,只透過組織 Web 服務呼叫,動作可供商務應用和擴充功能使用。 動作一般用來新增網域特定功能至組織 Web 服務,或組合多個組織 Web 服務訊息要求至單一要求。 例如,在支援客服中心,您可能想要合併 Create、Assign 和 Setstate 訊息至單一新的 Escalate 訊息。
使用工作流程,實作動作的商務邏輯。 當您建立動作時,相關即時工作流程會自動註冊,以便在執行管線的階段 30 (核心作業) 中執行。 如需即時工作流程的詳細資訊,請參閱工作流程類別。
雖然 Microsoft Dynamics CRM 2015 和 Microsoft Dynamics CRM Online 2015 更新 支援動作,但是只有 Microsoft Dynamics CRM 2015 內部部署與 IFD 支援以程式碼 (使用 XAML) 建立動作。 Online 客戶必須在 Web 應用程式以互動方式建立動作。
本主題內容
關於動作定義
所需權限
使用程式碼,建立動作
封裝要發佈的動作
產生動作的早期繫結類型
使用 Web 服務,執行動作
使用程序執行動作
留意長時間執行的動作
關於動作定義
透過使用 Workflow 實體記錄來定義動作,類似於即時工作流程。 以下列出何謂動作及其運作方式的一些重點:
可以與單一實體相關聯或是全域 (未與任何特定實體相關聯)。
是在事件執行管線的核心作業階段 30 中執行。
支援叫用在事件執行管線的前置作業和後置作業階段中註冊的外掛程式。
只有在動作狀態為已啟用時,才能在前置作業或後置作業階段中註冊外掛程式。
透過 organization.svc 和 organization.svc/web 端點可供使用,但不透過 organizationdata.svc (OData) 端點。
使用 JavaScript Web 資源,可執行。其他資訊:使用 JavaScript Web 資源,執行動作
永遠是在呼叫使用者的安全性內容下執行。
在動作上註冊外掛程式的步驟時,記錄無法刪除。
透過組態設定,可選擇性地,參與目前資料庫交易。
不支援執行限制為使用者、業務單位或組織的範圍。 動作一律在組織範圍中執行。
支援輸入或輸出引數。
支援稽核資料變更。
不支援離線用戶端。
可以由 Web 服務方法呼叫叫用。
注意
-
可以直接從工作流程叫用。
如果是 Microsoft Dynamics CRM Online 組織,只有在組織已更新至 Dynamics CRM Online 2015 更新 1 時,才能使用此功能。 有興趣取得此功能? 尋找您的 CRM 系統管理員或支援人員。 這項功能不適用於 Dynamics CRM (內部部署)。
所需權限
需要名為「啟用即時程序」(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 |
|
Entity |
|
EntityCollection |
|
System.DateTime |
DateTime |
System.Double |
Float |
System.Decimal |
Decimal |
Money |
|
System.Boolean |
Boolean |
Picklist |
下表中列出支援的引數屬性。
引數屬性 |
描述 |
---|---|
表示引數是否為必要。 |
|
表示引數方向是輸入或輸出。 |
|
指定引數的描述。 |
|
如果您想要傳入實體時使用。 |
|
此屬性自動產生或新增。 其指向工作流程執行的主要實體。 此屬性對全域動作是選擇性。 |
封裝要發佈的動作
若要發佈動作,以便匯入 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 CRM Online 從命令列執行此工具的格式。 您需要提供適用於公司客戶與伺服器的參數值。
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 服務,執行動作
使用 Managed 程式碼,若要使用組織 Web 服務執行動作,請執行下列步驟。
包含早期繫結類型檔案 (使用應用程式專案的 CrmSvcUtil 工具產生的)。
用您的應用程式碼,具現化您的動作要求並填入所有必要屬性。
叫用 Execute,並傳送您的要求做為引數。
在執行您的應用程式碼之前,請確定動作已啟用。 否則,您會收到執行階段錯誤。
使用 JavaScript Web 資源,執行動作
Sdk.Soap.js 範例程式庫示範如何搭配使用訊息與 JavaScript Web 資源和現代應用程式 SOAP 端點 (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 之外執行。
另請參閱
建立即時工作流程
針對引導式程序使用對話方塊
事件執行準銷售案源
寫入工作流程使業務程序自動化
TechNet:自訂您的系統
© 2017 Microsoft. 著作權所有,並保留一切權利。 著作權