Журналирование в Workflow

Особенности организации журналирования в пользовательских действиях процессов в Microsoft CRM 2016 / Dynamics 365.

Сериализация контекста

При сериализации контекста действия процесса (класса, реализующего интерфейс IWorkflowContext) с использованием Newtonsoft.Json происходит ошибка Error getting value from ‘ComponentState’ on ‘Microsoft.Crm.Metadata.OptionSetDescriptionFull’ или Error getting value from ‘UserTime’ on ‘Microsoft.Crm.Sdk.CrmDateTime’.

Это происходит потому, что сериализатор преобразует в строку не только свойства интерфейса IWorkflowContext, но и другие свойства исходного класса (класса Microsoft.Crm.Workflow.WorkflowContext), а в нем есть свойства, обращение к которым вызывает исключение.

Единственное доступное решение этой проблемы, которое я нашел — вручную сформировать объект для сериализации, ограничившись свойствами интерфейса IWorkflowContext.

using System;
using Microsoft.Xrm.Sdk;
using Newtonsoft.Json;

...

IWorkflowContext context;

...

var contextData = new
{
	MessageName = context.MessageName,
	StageName = context.StageName,
	Mode = context.Mode,
	UserId = context.UserId,
	InitiatingUserId = context.InitiatingUserId,
	BusinessUnitId = context.BusinessUnitId,
	OrganizationId = context.OrganizationId,
	OrganizationName = context.OrganizationName,
	CorrelationId = context.CorrelationId,
	Depth = context.Depth,
	PrimaryEntityId = context.PrimaryEntityId,
	PrimaryEntityName = context.PrimaryEntityName,
	SecondaryEntityName = context.SecondaryEntityName,
	IsExecutingOffline = context.IsExecutingOffline,
	IsInTransaction = context.IsInTransaction,
	IsOfflinePlayback = context.IsOfflinePlayback,
	IsolationMode = context.IsolationMode,
	OperationCreatedOn = context.OperationCreatedOn,
	RequestId = context.RequestId,
	OperationId = context.OperationId,
	ParentContext = context.ParentContext,
	InputParameters = context.InputParameters,
	OutputParameters = context.OutputParameters,
	OwningExtension = context.OwningExtension,
	PreEntityImages = context.PreEntityImages,
	PostEntityImages = context.PostEntityImages,
	WorkflowCategory = context.WorkflowCategory,
	WorkflowMode = context.WorkflowMode,
	SharedVariables = context.SharedVariables
};
var json = JsonConvert.SerializeObject(contextData, Formatting.Indented, 
	new JsonSerializerSettings { 
		ReferenceLoopHandling = ReferenceLoopHandling.Ignore
	});

About the author

Добавить комментарий

Сказать спасибо

Способ платежа:

Подписаться на обновления

Укажите свой e-mail чтобы получать уведомления о новых статьях.

Присоединиться к еще 1 подписчику