场景:
我想从位于CRM Dynamics上下文之外的网页调用已定义的工作流或自定义操作 . (比方说MS CRM 2011-2013-2015-2016和365)
我的解决方案
我的想法是将一种控制器页面定义到可从Web访问的CRM上下文中,并在该页面内执行其余调用(通过javascript) .该页面将能够读取输入参数并执行正确的休息呼叫 .
是否有意义?你能建议更好的实施吗?
提前致谢!
您可以在这样的js中调用工作流:
您可以通过名称和类型定义查询workflowId .
var entityId = // The GUID of the entity var workflowId = // The GUID of the workflow var url = // Your organization root var orgServicePath = "/XRMServices/2011/Organization.svc/web"; url = url + orgServicePath; var request; request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<s:Body>" + "<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">" + "<request i:type=\"b:ExecuteWorkflowRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">" + "<a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">" + "<a:KeyValuePairOfstringanyType>" + "<c:key>EntityId</c:key>" + "<c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + entityId + "</c:value>" + "</a:KeyValuePairOfstringanyType>" + "<a:KeyValuePairOfstringanyType>" + "<c:key>WorkflowId</c:key>" + "<c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + workflowId + "</c:value>" + "</a:KeyValuePairOfstringanyType>" + "</a:Parameters>" + "<a:RequestId i:nil=\"true\" />" + "<a:RequestName>ExecuteWorkflow</a:RequestName>" + "</request>" + "</Execute>" + "</s:Body>" + "</s:Envelope>"; var req = new XMLHttpRequest(); req.open("POST", url, false); // Responses will return XML. It isn't possible to return JSON. req.setRequestHeader("Accept", "application/xml, text/xml, */*"); req.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"); req.send(request);
如果request.status为200,则请求成功 . 这是在CRM2011环境中测试的 .
我建议你创建一个 WCF rest or web api ,引用IOrganizationService并从中使用CRM服务的操作 . 最好直接调用中间WCF而不是IOrganizationService .
如果您有资源,可以使用以下方法设置服务,然后ajax它 .
private static void ExecuteWorkflow(Guid workflowId, Guid entityId) { try { string url = ConfigurationManager.ConnectionStrings["crm"].ConnectionString; ClientCredentials cc = new ClientCredentials(); cc.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; OrganizationServiceProxy _service = new OrganizationServiceProxy(new Uri(url), null, cc, null); ExecuteWorkflowRequest request = new ExecuteWorkflowRequest() { WorkflowId = workflowId, EntityId = entityId }; ExecuteWorkflowResponse r = (ExecuteWorkflowResponse)_service.Execute(request); _service.Dispose(); } catch (Exception ex) { //Handle Exception } }
如果您无法在与CRM服务器相同的域上提供服务,则应该能够模拟 .
cc.Windows.ClientCredential.Domain = "DOMAIN"; cc.Windows.ClientCredential.Password = "PASSWORD"; cc.Windows.ClientCredential.UserName = "USERNAME";
你可以在这里找到更多细节 .
https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.executeworkflowrequest.aspx
2 回答
您可以在这样的js中调用工作流:
您可以通过名称和类型定义查询workflowId .
如果request.status为200,则请求成功 . 这是在CRM2011环境中测试的 .
我建议你创建一个 WCF rest or web api ,引用IOrganizationService并从中使用CRM服务的操作 . 最好直接调用中间WCF而不是IOrganizationService .
如果您有资源,可以使用以下方法设置服务,然后ajax它 .
如果您无法在与CRM服务器相同的域上提供服务,则应该能够模拟 .
你可以在这里找到更多细节 .
https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.executeworkflowrequest.aspx