通过插件执行方法将值从 Dynamics CRM 实体表单传递到外部 Web 服务
Passing values from Dynamics CRM entity form to external web service through plug-in execution method
我想在创建新记录时将实体 (Case/incident) 的一些值传递给外部 Web 服务。
我有一个用于准备必须发送到网络服务的数据的模型,如下所示:
public class TicketViewModel
{
public string CaseID { get; set; }
public string Subject { get; set; }
public string Description { get; set; }
public string CreateTime { get; set; }
public string Owner { get; set; }
public string States { get; set; }
public string Assigned { get; set; }
}
这是我在 Execute() 方法中的代码:
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(context.UserId);
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
try
{
var entity = (Entity)context.InputParameters["Target"];
if (entity.LogicalName != "incident") // The logical name for Case entity
return;
Guid recordID = entity.Id;
var ticket = new CaseViewModel
{
// Retrieving Intended Fields Value
};
BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.Name = "HttpBinding_Service";
httpBinding.Security.Mode = BasicHttpSecurityMode.None;
httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
httpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
httpBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
EndpointAddress epa = new EndpointAddress(@"webservice/url/address");
CallChamberPortalSoapClient tcClient = new CallChamberPortalSoapClient(httpBinding, epa);
var res = tcClient.addTicket(//Passing Intended Fields Value);
entity["X"] = res.ToString();
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException("Failed to register ticket by this error: " + ex.Message);
}
- 我的第一个问题是如何在创建新记录时检索预期的字段值?我已经使用 entity["X"] 来获取 "X" 字段的值但没有返回任何内容。
- 我的第二个问题是如何在更新记录时设置字段的值?使用相同的表达式( entity["X"] = "NewValue" )对我不起作用。
注意:示例静态数据已成功发送到 Web 服务,结果返回 true。
编辑:
我尝试获取如下值,但在 CRM 创建记录事件中出现错误。
ColumnSet cs = new ColumnSet(new string[] {
"ticketnumber", "title", "description", "createdon", "customerid", "new_peygiriii", "createdby" });
Entity wholeCase = service.Retrieve("incident", recordID, cs);
Owner = wholeCase.GetAttributeValue<EntityReference>("customerid").ToString();
错误:
Unable to cast object of type Microsoft.Xrm.Sdk.OptionSetValue to type
Microsoft.Xrm.Sdk.EntityReference
谢谢。
首先,您应该在 Dynamics 中将您的插件注册为 Post 操作(创建)。原因是在系统中创建记录后,您将获得它的 Guid 等。这是最好的方法,此外还使您的插件异步(仅当您的用例确实需要时才使用 syn)。
现在,当您在 crm 插件中创建记录时,将在您执行操作时获取它的上下文。
var entity = (Entity)context.InputParameters["Target"];
现在您可以获得特定的字段值,您可以执行以下操作
if(entity.contains("field name")){
var recordName=entity.GetAttributeValue<string>("field name");
}
如果你想要选项集值,你可以像下面那样做
if(entity.contains("optionset field name")){
int selectedTopic = entity.GetAttributeValue<OptionSetValue>("optionset field name").Value
String text = entity.FormattedValues["optionset field name"].ToString();
}
要设置?你想设置什么类型的数据,假设你想设置选项集值
entity["X"] = new OptionSetValue(INDEX)
INDEX 是一个整数,您可以在选项集编辑器中查找(默认值是几位数)。
我想在创建新记录时将实体 (Case/incident) 的一些值传递给外部 Web 服务。
我有一个用于准备必须发送到网络服务的数据的模型,如下所示:
public class TicketViewModel
{
public string CaseID { get; set; }
public string Subject { get; set; }
public string Description { get; set; }
public string CreateTime { get; set; }
public string Owner { get; set; }
public string States { get; set; }
public string Assigned { get; set; }
}
这是我在 Execute() 方法中的代码:
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(context.UserId);
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
try
{
var entity = (Entity)context.InputParameters["Target"];
if (entity.LogicalName != "incident") // The logical name for Case entity
return;
Guid recordID = entity.Id;
var ticket = new CaseViewModel
{
// Retrieving Intended Fields Value
};
BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.Name = "HttpBinding_Service";
httpBinding.Security.Mode = BasicHttpSecurityMode.None;
httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
httpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
httpBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
EndpointAddress epa = new EndpointAddress(@"webservice/url/address");
CallChamberPortalSoapClient tcClient = new CallChamberPortalSoapClient(httpBinding, epa);
var res = tcClient.addTicket(//Passing Intended Fields Value);
entity["X"] = res.ToString();
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException("Failed to register ticket by this error: " + ex.Message);
}
- 我的第一个问题是如何在创建新记录时检索预期的字段值?我已经使用 entity["X"] 来获取 "X" 字段的值但没有返回任何内容。
- 我的第二个问题是如何在更新记录时设置字段的值?使用相同的表达式( entity["X"] = "NewValue" )对我不起作用。
注意:示例静态数据已成功发送到 Web 服务,结果返回 true。
编辑:
我尝试获取如下值,但在 CRM 创建记录事件中出现错误。
ColumnSet cs = new ColumnSet(new string[] {
"ticketnumber", "title", "description", "createdon", "customerid", "new_peygiriii", "createdby" });
Entity wholeCase = service.Retrieve("incident", recordID, cs);
Owner = wholeCase.GetAttributeValue<EntityReference>("customerid").ToString();
错误:
Unable to cast object of type Microsoft.Xrm.Sdk.OptionSetValue to type Microsoft.Xrm.Sdk.EntityReference
谢谢。
首先,您应该在 Dynamics 中将您的插件注册为 Post 操作(创建)。原因是在系统中创建记录后,您将获得它的 Guid 等。这是最好的方法,此外还使您的插件异步(仅当您的用例确实需要时才使用 syn)。
现在,当您在 crm 插件中创建记录时,将在您执行操作时获取它的上下文。
var entity = (Entity)context.InputParameters["Target"];
现在您可以获得特定的字段值,您可以执行以下操作
if(entity.contains("field name")){
var recordName=entity.GetAttributeValue<string>("field name");
}
如果你想要选项集值,你可以像下面那样做
if(entity.contains("optionset field name")){
int selectedTopic = entity.GetAttributeValue<OptionSetValue>("optionset field name").Value
String text = entity.FormattedValues["optionset field name"].ToString();
}
要设置?你想设置什么类型的数据,假设你想设置选项集值
entity["X"] = new OptionSetValue(INDEX)
INDEX 是一个整数,您可以在选项集编辑器中查找(默认值是几位数)。