簡體   English   中英

Dynamics CRM 2011的自動命名生成器插件在進入執行之前崩潰

[英]Autoname generator plugin for Dynamics CRM 2011 crashes before it enters execute

我有一個自定義實體acm_lidmaatschapbedrijf,在創建該實體時必須自動為其生成一個名稱,因此用戶無需自己執行此操作。

我為此獲得了以下課程:

protected class LocalPluginContext
    {
        internal IOrganizationService OrganizationService
        {
            get;
            private set;
        }

        internal IPluginExecutionContext PluginExecutionContext
        {
            get;

            private set;
        }

        internal ITracingService TracingService
        {
            get;

            private set;
        }

        internal LocalPluginContext(IServiceProvider serviceProvider)
        {
            if (serviceProvider == null)
            {
                throw new ArgumentNullException("serviceProvider");
            }

            // Obtain the execution context service from the service provider.
            PluginExecutionContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            // Obtain the tracing service from the service provider.
            TracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            Trace("Tracingservice aangemaakt.");
            // Obtain the Organization Service factory service from the service provider
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            Trace("Factory aangemaakt");
            // Use the factory to generate the Organization Service.
            OrganizationService = factory.CreateOrganizationService(PluginExecutionContext.UserId);
            Trace("Service aangemaakt");
        }

        internal void Trace(string message)
        {
            if (string.IsNullOrWhiteSpace(message) || TracingService == null)
            {
                return;
            }
            if (PluginExecutionContext == null)
            {
                TracingService.Trace(message);
            }
            else
            {
                TracingService.Trace(
                    "{0}, Correlation Id: {1}, Initiating User: {2}",
                    message,
                    PluginExecutionContext.CorrelationId,
                    PluginExecutionContext.InitiatingUserId);
            }
        }
    }


    public void Execute(IServiceProvider serviceProvider)
    {
        if (serviceProvider == null)
        {
            throw new ArgumentNullException("serviceProvider");
        }

        // Construct the Local plug-in context.
        LocalPluginContext localcontext = new LocalPluginContext(serviceProvider);
        //Get the entity;
        localcontext.Trace("Localcontext aangemaakt");
        acm_lidmaatschapbedrijf lidmaatschapbedrijf = ((Entity)localcontext.PluginExecutionContext.InputParameters["Target"]).ToEntity<acm_lidmaatschapbedrijf>();
        //Check whether the linked lidmaatschap is the right one;
        localcontext.Trace("lidmaatschapbedrijf opghaald");
        acm_lidmaatschap lidmaatschapcategorie = localcontext.OrganizationService.Retrieve(acm_lidmaatschap.EntityLogicalName, lidmaatschapbedrijf.acm_typelidmaatschap.Id, new ColumnSet(new[] { "acm_typelidmaatschap" })).ToEntity<acm_lidmaatschap>();
        localcontext.Trace("Categorie opgehaald");
        localcontext.Trace(string.Format("Categorie = {0}", lidmaatschapcategorie.acm_typelidmaatschap.Value));
        if (lidmaatschapcategorie.acm_typelidmaatschap.Value != 805210000)
        {
            throw new InvalidPluginExecutionException("Het type lidmaatschap is niet bedrijf.");
        }
        //assign name
        lidmaatschapbedrijf["acm_name"] = string.Format("{0} {1}", "Bedrijfslidmaatschap", lidmaatschapbedrijf.acm_account.Name);
        localcontext.Trace(string.Format("Nieuwe naam = {0}", lidmaatschapbedrijf.acm_name));
        localcontext.PluginExecutionContext.InputParameters["Target"] = lidmaatschapbedrijf;
        localcontext.Trace("Target opnieuw toegekend");


    }
}

這是插件注冊的方式

在此處輸入圖片說明

看起來好像插件已啟動,但由於以下錯誤轉儲而崩潰:

Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: System.Runtime.Serialization.SerializationException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #6C7B81E3Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220970</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
    <KeyValuePairOfstringanyType>
      <d2p1:key>CallStack</d2p1:key>
      <d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract&amp; dataContract)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle declaredTypeHandle, String name, String ns)
   at ReadKeyValuePairOfstringanyTypeFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[] )
   at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract&amp; dataContract)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle declaredTypeHandle, String name, String ns)
   at ReadParameterCollectionFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString , XmlDictionaryString , CollectionDataContract )
   at System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract&amp; dataContract)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)
   at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
   at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
   at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)
   at Microsoft.Crm.Sandbox.SandboxUtility.DeserializeDataContract[T](Byte[] serializedDataContract, Assembly proxyTypesAssembly)
   at Microsoft.Crm.Sandbox.SandboxExecutionContext.get_InputParameters()
   at Microsoft.Crm.Sandbox.SandboxExecutionContext.Merge(IExecutionContext originalContext)
   at Microsoft.Crm.Sandbox.SandboxCodeUnit.Execute(IExecutionContext context)</d2p1:value>
    </KeyValuePairOfstringanyType>
  </ErrorDetails>
  <Message>System.Runtime.Serialization.SerializationException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #6C7B81E3</Message>
  <Timestamp>2014-05-09T11:55:16.4261105Z</Timestamp>
  <InnerFault i:nil="true" />
  <TraceText>

[acm.mscrm.stm.Plugins: acm.mscrm.stm.Plugins.BedrijfsLidmaatschapPreValidator]
[e0ec46f5-f5d5-e311-b055-005056a03018: acm.mscrm.stm.Plugins.BedrijfsLidmaatschapPreValidator: Create of acm_lidmaatschapbedrijf]


</TraceText>
</OrganizationServiceFault>

如您所見,它不顯示任何痕跡。 它只是崩潰,我不知道為什么。 您是否需要進行任何特殊設置才能使用InputParameters [“ Target”]?

序列化錯誤來自以下行:

localcontext.PluginExecutionContext.InputParameters["Target"] = lidmaatschapbedrijf;

您不能將早期綁定實體分配給InputParameter [“ Target”]。 分配必須是后期綁定的實體,即Entity()

還行吧

Entity lidmaatschapbedrijf = new Entity("new_ lidmaatschapbedrijf")
lidmaatschapbedrijf.acm_name = "constructed name";
localcontext.PluginExecutionContext.InputParameters["Target"] = lidmaatschapbedrijf;

您也可以這樣做...

localcontext.PluginExecutionContext.InputParameters["Target"] = lidmaatschapbedrijf.ToEntity<Entity>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM