I get below error when i call custom action from API
{
"error": {
"code": "0x80040265",
"message": "Object reference not set to an instance of an object.",
"innererror": {
"message": "Object reference not set to an instance of an object.",
"type": "System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]",
"stacktrace": " at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(OrganizationRequest request, InvocationContext invocationContext, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode, ExecutionContext executionContext, Dictionary`2 optionalParameters)\r\n at Microsoft.Crm.Extensibility.OData.CrmODataExecutionContext.Execute(OrganizationRequest request, ExecutionContext executionContext)\r\n at Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.ExecuteOperation(CrmODataExecutionContext context, EdmOperation edmOperation, Dictionary`2 parameters, Dictionary`2 boundParameters)\r\n at Microsoft.Crm.Extensibility.OData.ActionController.ProcessOperationRequest(String operationName, Dictionary`2 operationParameters, EntityReference entityReference, String boundEntityName, String boundEntityType)\r\n at Microsoft.Crm.Extensibility.OData.ActionController.<>c__DisplayClass9_0.<PostUnboundAction>b__0()\r\n at Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute[TResult](ILogger logger, EventId eventId, ActivityType activityType, Func`1 func, IEnumerable`1 additionalCustomProperties)\r\n at Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute[TResult](ILogger logger, XrmTelemetryActivityType activityType, Func`1 func)\r\n at Microsoft.Crm.Extensibility.OData.ActionController.PostUnboundAction(String operationName, ODataUntypedActionParameters parameters)\r\n at lambda_method(Closure , Object , Object[] )\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
}
}
Below is my code
public class CustomAction : CodeActivity
{
[Input("Entity Metadata Id")]
public InArgument<string> MetadataId { get; set; }
[Output("Entity Details")]
public OutArgument<string> EntityInfo { get; set; }
protected override void Execute(CodeActivityContext executionContext)
{
//Retrieve the id
string accountId = this.MetadataId.Get(executionContext);
//Create the tracing service
ITracingService tracingService = executionContext.GetExtension<ITracingService>();
//Create the context
IWorkflowContext workflowContext = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService orgService = serviceFactory.CreateOrganizationService(workflowContext.UserId);
var output= new EntityInfo();
//Get the Entity Metadata from the entityName
var retrieveEntityRequest = new RetrieveEntityRequest
{
EntityFilters = EntityFilters.All,
MetadataId = Guid.Parse(MetadataId.Get(context))
};
var entityResponse = (RetrieveEntityResponse)orgService.Execute(retrieveEntityRequest);
var entityMetadata = entityResponse.EntityMetadata;
var entityName = entityMetadata.LogicalName;
output.EntityName = entityName;
output.PrimaryIdAttributeName = entityMetadata.PrimaryIdAttribute;
//Get the column name to be used to query the count of the entity.
var columnName = string.IsNullOrEmpty(entityMetadata.PrimaryIdAttribute)
? entityMetadata.Attributes.FirstOrDefault()?.LogicalName
: entityMetadata.PrimaryIdAttribute;
//get the column Count
output.ColumnCount = entityMetadata.Attributes.ToList().Count;
//fetchXml to retrieve count of entity
var entityCountXml =
$"<fetch distinct='false' mapping='logical' aggregate='true'>" +
$"<entity name='{entityName}'>" +
$"<attribute name='{columnName}' alias='rowCount' aggregate='count'/>" +
$"</entity>" +
$"</fetch>";
// Retrieving cases using fetchXml
var rowCount = 0;
var result = orgService.RetrieveMultiple(new FetchExpression(entityCountXml));
foreach (var c in result.Entities)
{
rowCount = (Int32)((AliasedValue)c["rowCount"]).Value;
}
output.RowCount = rowCount;
var customColumns = entityMetadata.Attributes.Count(s => s.IsCustomAttribute != null && (bool) s.IsCustomAttribute);
var systemColumns = entityMetadata.Attributes.Count(s => s.IsCustomAttribute != null && !(bool)s.IsCustomAttribute);
}
}