У меня есть плагин Dynamics CRM 2013, работающий в песочнице.
Этот код имеет следующий настраиваемый класс исключения:
[Serializable]
public class PluginValidationException : Exception
{
public PluginValidationException()
{
}
protected PluginValidationException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
public PluginValidationException(string message)
: base(message)
{
}
public PluginValidationException(string message, Exception inner)
: base(message, inner)
{
}
}
Когда это исключение выбрасывается в плагине, это приводит к общему окну ошибки без каких-либо подробностей в файле журнала:
Необработанное исключение: System.ServiceModel.FaultException`1 [[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version = 6.0.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35]]: System.Runtime.Serialization .SerializationException: в Microsoft Dynamics CRM произошла ошибка. Справочный номер для администраторов или службы поддержки: # 1355B4E4 Подробная информация: -2147220970 CallStack в Microsoft.Crm.Application.Platform.ServiceCommands.PlatformCommand.XrmExecuteInternal () в Microsoft.Crm.Application.Platform.ServiceCommands.CreateCommand. Application.Platform.EntityProxy.Create (Boolean performDuplicateCheck, Guid auditingTransactionId) в Microsoft.Crm.Application.Platform.EntityProxy.Create (Boolean performDuplicateCheck) в Microsoft.Crm.Application.Platform.EntityProxy.CreveDownload (Boolean performDuplicateCheck), StringCreveDublication.Platform.EntityProxy. ) в Microsoft.Crm.Application.WebServices.InlineEdit.CommandBase.UpdateEntity (сущность сущности, логическое извлечение) в Microsoft.Crm.Application.WebServices.InlineEdit.SaveCommand.ExecuteCommand (String commandXml) в Microsoft.Crmb.Application. .CommandBase.Execute (String commandXml) System.Runtime.Serialization.SerializationException: Microsoft D ynamics CRM произошла ошибка. Номер ссылки для администраторов или службы поддержки: # 1355B4E4 2014-04-06T02: 04: 30.0972001Z [Demo.DemoPlugin: Demo.DemoPlugin.BasicCrmPlugin] [d86b89ab-f1bc-e311-9408-000c29254b18: Demo.DemoPlugin.BasicCrm ]
Просмотр журнала трассировки CRM показывает следующее:
System.Runtime.Serialization.SerializationException: введите Demo.Helpers.PluginValidationException в сборке Demo.DemoPlugin, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = fbb51ba1e588d276 не помечен как сериализуемый. на Microsoft.Crm.Sandbox.SandboxAppDomainHelper.Execute (IServiceEndpointNotificationService serviceBusService, IOrganizationServiceFactory organizationServiceFactory, струнного pluginTypeName, струнного pluginConfiguration, струнного pluginSecureConfig, IPluginExecutionContext RequestContext) в Microsoft.Crm.Sandbox.SandboxWorker.Execute (SandboxCallInfo callInfo, SandboxPluginExecutionContext RequestContext, Guid pluginAssemblyId, Int32 sourceHash, String assemblyName, Guid pluginTypeId, String pluginTypeName, String pluginConfiguration, String pluginSecureConfig, SandboxRequestCounter & workerCounter)
На основании некоторого чтения я не считаю, что это ошибка - скорее, это потому, что пользовательские классы Exception
не являются надежными по своей природе, начиная с .NET 4 (я использую .NET 4.5).
Кто-нибудь знает, как создать собственный класс исключения, который будет работать с песочницей CRM. Я использую собственный класс исключений, потому что я перехватываю ошибки и мне нужно различать InvalidPluginExecutionException
исключение, вызванное неправильной регистрацией подключаемого модуля.
ОБНОВЛЕНО 8 апреля 2014 г.
Вот код в плагине, который перехватывает исключения, со значительным упрощением для помещения его в Stackoverflow:
try
{
//TODO: Prevalidation Logic
ValidatePluginExecution(crmContext, logging, out keyName);
//TODO: Postvalidation Logic
}
catch (PluginValidationException ex)
{
//TODO: Specific logging for Plugin Validation Exception
throw new InvalidPluginExecutionException("Did Not Validate");
}
catch (InvalidPluginExecutionException ex)
{
logging.Write("InvalidPluginExectionException at Plugin Validation");
throw;
}
catch (Exception ex)
{
logging.Write("Unhandled Exeception During Plugin Validation Operation");
logging.Write(ex);
throw new InvalidPluginExecutionException("Error. Download Log and submit to the Help Desk.", ex);
}