Felsöka plugin-program för Dataverse

Den här artikeln innehåller information om fel som kan uppstå under plugin-körning eller Dataverse-fel som är relaterade till plugin-program och hur du undviker eller åtgärdar dem.

Felet "Det gick inte att slutföra tidskonverteringen"

Felkod: -2147220956
Felmeddelande: Konverteringen kunde inte slutföras eftersom den angivna DataTime-egenskapen inte har angetts korrekt. Om egenskapen Kind till exempel är DateTimeKind.Local måste källtidszonen vara TimeZoneInfo.Local.

Det här felet kan inträffa under ett TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) anrop i plugin-koden för att konvertera ett DateTime värde i tidszonen Santiago eller Volgograd till COORDINATED Universal Time (UTC).

Det här felet orsakas av en känd produktbegränsning och det finns för närvarande ingen lösning.

Mer information finns i Ange tidszonsinställningar för en användare.

Felet "Sandbox Worker-processen kraschade"

Felkod: -2147204723
Felmeddelande: Plugin-körningen misslyckades eftersom sandbox-arbetsprocessen kraschade. Detta beror vanligtvis på ett fel i plugin-koden.

Det här felet innebär helt enkelt att arbetsprocessen som kör plugin-koden kraschade. Plugin-programmet kan vara orsaken till kraschen, men det kan också vara ett annat plugin-program som körs samtidigt för din organisation. Eftersom processen kraschade kan vi inte extrahera mer specifik information om varför den kraschade. Men efter att ha undersökt data från kraschdumpar i efterhand upptäckte vi att det här felet vanligtvis inträffar på grund av någon av de fyra orsakerna:

Ohanterat undantag i plugin-programmet

När du skriver ett plugin-program bör du försöka förutse vilka åtgärder som kan misslyckas och omsluta dem i ett try-catch-block. När ett fel inträffar bör du använda InvalidPluginExecutionException klassen för att avsluta åtgärden korrekt med ett fel som är meningsfullt för användaren.

Mer information finns i Hantera undantag i plugin-program.

Ett vanligt scenario för det här undantaget är när du använder metoden HttpClient.SendAsync eller HttpClient.GetAsync . Dessa HttpClient-metoder är asynkrona åtgärder som returnerar en aktivitet. För att arbeta i ett plugin-program där koden måste vara synkron kan personer använda TResult> för uppgiften<. Resultategenskap. När ett fel inträffar Result returnerar en AggregateException. En AggregateException konsoliderar flera fel till ett enda undantag, vilket kan vara svårt att hantera. En bättre design är att använda Task<TResult>. GetAwaiter(). GetResult() eftersom det sprider resultatet som det specifika fel som orsakade felet.

I följande exempel visas rätt sätt att hantera undantaget och ett utgående anrop med hjälp av metoden HttpClient.GetAsync . Det här plugin-programmet försöker hämta svarstexten för en URI som angetts i den osäkra konfigurationen för ett steg som registrerats för den.

using Microsoft.Xrm.Sdk;
using System;
using System.Net.Http;

namespace ErrorRepro
{
    public class AsyncError : IPlugin
    {
        private readonly string webAddress;

        public AsyncError(string unsecureConfig)
        {
            if (string.IsNullOrEmpty(unsecureConfig)) {
                throw new InvalidPluginExecutionException("The ErrorRepro.AsyncError plug-in requires that a Url be set in the unsecure configuration for the step registration.");
            }
            webAddress = unsecureConfig;

        }

        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService tracingService =
            (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            tracingService.Trace($"Starting ErrorRepro.AsyncError");
            tracingService.Trace($"Sending web request to {webAddress}");

            try
            {
                string responseText = GetWebResponse(webAddress, tracingService);
                tracingService.Trace($"Result: {responseText.Substring(0, 100)}");
            }
            catch (Exception ex)
            {
                tracingService.Trace($"Error: ErrorRepro.AsyncError {ex.Message}");
                throw new InvalidPluginExecutionException(ex.Message);
            }
            tracingService.Trace($"Ending ErrorRepro.AsyncError");
        }

        //Gets the text response of an outbound web service call
        public string GetWebResponse(string webAddress, ITracingService tracingService)
        {
            try
            {
                using (HttpClient client = new HttpClient())
                {
                    client.Timeout = TimeSpan.FromMilliseconds(15000); //15 seconds
                    client.DefaultRequestHeaders.ConnectionClose = true; //Set KeepAlive to false

                    HttpResponseMessage response = client.GetAsync(webAddress).GetAwaiter().GetResult(); //Make sure it is synchronous
                    response.EnsureSuccessStatusCode();

                    tracingService.Trace($"ErrorRepro.AsyncError.GetWebResponse succeeded.");

                    string responseContent = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); //Make sure it is synchronous

                    tracingService.Trace($"ErrorRepro.AsyncError.GetWebResponse responseContent parsed successfully.");

                    return responseContent;

                }
            }
            catch (Exception ex)
            {
                //Capture the inner exception message if it exists.
                // It should have a more specific detail.
                string innerExceptionMessage = string.Empty;
                if (ex.InnerException != null) {
                    innerExceptionMessage = ex.InnerException.Message;
                }

                tracingService.Trace($"Error in ErrorRepro.AsyncError : {ex.Message} InnerException: {innerExceptionMessage}");
                if (!string.IsNullOrEmpty(innerExceptionMessage))
                {
                    throw new Exception($"A call to an external web service failed. {innerExceptionMessage}", ex);
                }

                throw new Exception("A call to an external web service failed.", ex);
            }
        }
    }
}

Använda trådar för att köa arbete utan försök/fångst i tråddelegat

Du bör inte använda parallella körningsmönster i plugin-program. Det här antimönstret beskrivs i artikeln om bästa praxis: Använd inte parallell körning i plugin-program och arbetsflödesaktiviteter. Om du använder dessa mönster kan det orsaka problem med att hantera transaktionen i ett synkront plugin-program. En annan anledning till att inte använda dessa mönster är dock att allt arbete som utförs utanför ett try/catch block i en tråddelegat kan krascha arbetsprocessen.

Viktigt

När arbetsprocessen kraschar avslutas körningen av plugin-programmet och andra plugin-program som körs i den processen. Detta inkluderar plugin-program som du inte äger eller underhåller.

Application Insights till undsättning

Tidigare var det omöjligt att hämta stackspårningen eller annan körningsinformation för ohanterade plugin-undantag från den kraschade arbetsprocessen. Dataverse har dock nu stöd för loggningskörningsfel i Application Insights. Om du vill aktivera den här funktionen kan du länka Application Insights till miljön där plugin-programmet är registrerat. När det är länkat sker loggningen av plugin-programkrascher automatiskt.

Mer information finns i Exportera data till Application Insights.

När en Application Insights-miljö har länkats är följande data från en arbetsprocesskrasch tillgängliga för felsökning av problemet.

Exempel på en Application Insights-plugin-kraschrapport.

Så här navigerar du till kraschrapporten i Application Insights:

  1. Länka Application Insights till din miljö.
  2. Vänta tills ett plugin-undantag resulterar i kraschfelet i arbetsprocessen.
  3. Gå till Application Insights i administrationscentret för Power Platform.
  4. På sidan Application Insights väljer du Fel i den vänstra panelen.
  5. På sidan Fel väljer du Undantag.
  6. Under Undantagsproblem-ID går du till listan Övergripande och väljer Microsoft.PowerPlatform.Dataverse.Plugin.PluginWorkerCrashException.
  7. Till höger på sidan, under Övergripande, väljer du PluginWorkerCrashException. Nu visas information om alla registrerade undantag för arbetsprocesskrascher.
  8. Search för och välj önskat undantag i den vänstra panelen, så visas rapporten med undantagsinformation till höger på sidan (se föregående skärmbild som exempel).
  9. Om du vill komma åt stackspårningen expanderar du CrashDetails i rapporten.

Stack overflow-fel i plugin-programmet

Den här typen av fel inträffar oftast direkt efter att du har gjort några ändringar i plugin-koden. Vissa använder sin egen uppsättning basklasser för att effektivisera sin utvecklingsupplevelse. Ibland kommer dessa fel från ändringar i de basklasser som ett visst plugin-program är beroende av.

Till exempel kan ett rekursivt anrop utan ett avslutningsvillkor eller ett avslutningsvillkor, som inte täcker alla scenarier, orsaka att det här felet uppstår. Mer information finns i Klasskommentarer för StackOverflowException>.

Du bör granska eventuella kodändringar som har tillämpats nyligen för plugin-programmet och annan kod som plugin-koden är beroende av.

Exempel

Följande plugin-kod orsakar ett StackOverflowException på grund av ett rekursivt anrop utan gränser. Trots att spårningen används och försöker fånga upp felet returneras inte spårningen och felet eftersom arbetsprocessen som skulle bearbeta dem avslutades.

using Microsoft.Xrm.Sdk;
using System;

namespace ErrorRepro
{
    public class SOError : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService tracingService =
           (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            tracingService.Trace($"Starting ErrorRepro.SOError");

            try
            {
                tracingService.Trace($"Calling RecursiveMethodWithNoLimit to trigger StackOverflow error.");

                RecursiveMethodWithNoLimit(tracingService); //StackOverflowException occurs here.
            }
            catch (Exception ex)
            {
                //This trace will not be written
                tracingService.Trace($"Error in ErrorRepro.SOError {ex.Message}");

                //This error will never be thrown
                throw new InvalidPluginExecutionException($"Error in ErrorRepro.SOError. {ex.Message}");
            }

            //This trace will never be written
            tracingService.Trace($"Ending ErrorRepro.SOError");
        }

        public static void RecursiveMethodWithNoLimit(ITracingService tracingService)
        {
            tracingService.Trace($"Starting ErrorRepro.SOError.RecursiveMethodWithNoLimit");

            RecursiveMethodWithNoLimit(tracingService);

            tracingService.Trace($"Ending ErrorRepro.SOError.RecursiveMethodWithNoLimit");
        }
    }
}

I ett synkront plugin-steg returnerar plugin-koden som visades tidigare följande fel i webb-API:et när begäran har konfigurerats för att inkludera ytterligare information med fel.

{
    "error": {
        "code": "0x8004418d",
        "message": "The plug-in execution failed because the Sandbox Worker process crashed. This is typically due to an error in the plug-in code.\r\nSystem.ServiceModel.CommunicationException: The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.\r\n   at Microsoft.Crm.Sandbox.SandboxWorkerProcess.Execute(SandboxCallInfo callInfo, SandboxPluginExecutionContext requestContext, Guid pluginAssemblyId, Int32 sourceHash, String assemblyName, Guid pluginTypeId, String pluginTypeName, String pluginConfiguration, String pluginSecureConfig, Boolean returnTraceInfo, Int64& wcfExecInMs, Int64& initializeInMs, Int64& trackCallInMs, Int64& trackGoodReturnInMs, Int64& waitInMs, Int64& taskStartDelay) +0x330: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #8503641A",
        "@Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionSourceKey": "Plugin/ErrorRepro.SOError, ErrorRepro, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c2bee3e550ec0851",
        "@Microsoft.PowerApps.CDS.ErrorDetails.ApiStepKey": "d5958631-b87e-eb11-a812-000d3a4f50a7",
        "@Microsoft.PowerApps.CDS.ErrorDetails.ApiDepthKey": "1",
        "@Microsoft.PowerApps.CDS.ErrorDetails.ApiActivityIdKey": "a3028bda-73c2-4eef-bcb5-157c5a4c323e",
        "@Microsoft.PowerApps.CDS.ErrorDetails.ApiPluginSolutionNameKey": "Active",
        "@Microsoft.PowerApps.CDS.ErrorDetails.ApiStepSolutionNameKey": "Active",
        "@Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionCategory": "SystemFailure",
        "@Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionMesageName": "SandboxWorkerNotAvailable",
        "@Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionHttpStatusCode": "500",
        "@Microsoft.PowerApps.CDS.HelpLink": "http://go.microsoft.com/fwlink/?LinkID=398563&error=Microsoft.Crm.CrmException%3a8004418d&client=platform",
        "@Microsoft.PowerApps.CDS.TraceText": "\r\n[ErrorRepro: ErrorRepro.SOError]\r\n[d5958631-b87e-eb11-a812-000d3a4f50a7: ErrorRepro.SOError: Create of account]\r\n\r\n",
        "@Microsoft.PowerApps.CDS.InnerError.Message": "The plug-in execution failed because the Sandbox Worker process crashed. This is typically due to an error in the plug-in code.\r\nSystem.ServiceModel.CommunicationException: The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.\r\n   at Microsoft.Crm.Sandbox.SandboxWorkerProcess.Execute(SandboxCallInfo callInfo, SandboxPluginExecutionContext requestContext, Guid pluginAssemblyId, Int32 sourceHash, String assemblyName, Guid pluginTypeId, String pluginTypeName, String pluginConfiguration, String pluginSecureConfig, Boolean returnTraceInfo, Int64& wcfExecInMs, Int64& initializeInMs, Int64& trackCallInMs, Int64& trackGoodReturnInMs, Int64& waitInMs, Int64& taskStartDelay) +0x330: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #8503641A"
    }
}

Följande visar hur det här felet registreras i plugin-programmet Tracelog:

Unhandled exception: 
Exception type: System.ServiceModel.FaultException`1[Microsoft.Xrm.Sdk.OrganizationServiceFault]
Message: The plug-in execution failed because the Sandbox Worker process crashed. This is typically due to an error in the plug-in code.
System.ServiceModel.CommunicationException: The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.
   at Microsoft.Crm.Sandbox.SandboxWorkerProcess.Execute(SandboxCallInfo callInfo, SandboxPluginExecutionContext requestContext, Guid pluginAssemblyId, Int32 sourceHash, String assemblyName, Guid pluginTypeId, String pluginTypeName, String pluginConfiguration, String pluginSecureConfig, Boolean returnTraceInfo, Int64& wcfExecInMs, Int64& initializeInMs, Int64& trackCallInMs, Int64& trackGoodReturnInMs, Int64& waitInMs, Int64& taskStartDelay) +0x330: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #4BC22433Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ActivityId>48c5818e-4912-42f0-b1b6-e3bbe7ae013d</ActivityId>
  <ErrorCode>-2147204723</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
  <HelpLink i:nil="true" />
  <Message>The plug-in execution failed because the Sandbox Worker process crashed. This is typically due to an error in the plug-in code.
System.ServiceModel.CommunicationException: The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.
   at Microsoft.Crm.Sandbox.SandboxWorkerProcess.Execute(SandboxCallInfo callInfo, SandboxPluginExecutionContext requestContext, Guid pluginAssemblyId, Int32 sourceHash, String assemblyName, Guid pluginTypeId, String pluginTypeName, String pluginConfiguration, String pluginSecureConfig, Boolean returnTraceInfo, Int64&amp; wcfExecInMs, Int64&amp; initializeInMs, Int64&amp; trackCallInMs, Int64&amp; trackGoodReturnInMs, Int64&amp; waitInMs, Int64&amp; taskStartDelay) +0x330: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #4BC22433</Message>
  <Timestamp>2021-03-06T22:14:22.0629638Z</Timestamp>
  <ExceptionRetriable>false</ExceptionRetriable>
  <ExceptionSource>WorkerCommunication</ExceptionSource>
  <InnerFault i:nil="true" />
  <OriginalException>System.ServiceModel.CommunicationException: The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

Server stack trace: 
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at Microsoft.Crm.Sandbox.SandboxWorkerProcess.Execute(SandboxCallInfo callInfo, SandboxPluginExecutionContext requestContext, Guid pluginAssemblyId, Int32 sourceHash, String assemblyName, Guid pluginTypeId, String pluginTypeName, String pluginConfiguration, String pluginSecureConfig, Boolean returnTraceInfo, Int64&amp; wcfExecInMs, Int64&amp; initializeInMs, Int64&amp; trackCallInMs, Int64&amp; trackGoodReturnInMs, Int64&amp; waitInMs, Int64&amp; taskStartDelay)</OriginalException>
  <TraceText i:nil="true" />
</OrganizationServiceFault>

Arbetsprocessen når minnesgränsen

Varje arbetsprocess har en begränsad mängd minne. Det finns villkor där flera samtidiga åtgärder som innehåller stora mängder data kan överskrida det tillgängliga minnet och orsaka att processarbetaren kraschar.

RetrieveMultiple med fildata

Det vanliga scenariot är i det här fallet när ett plugin-program körs för en RetrieveMultiple åtgärd där begäran innehåller fildata. När du till exempel hämtar e-postmeddelanden som innehåller bifogade filer. Mängden data som kan returneras i en fråga som denna är oförutsägbar eftersom alla e-postmeddelanden kan vara relaterade till valfritt antal bifogade filer och de bifogade filerna kan variera i storlek.

När flera begäranden av liknande karaktär körs samtidigt blir mängden minne som krävs stort. Om mängden minne överskrider gränsen kraschar processen. Nyckeln för att förhindra den här situationen är att RetrieveMultiple begränsa frågor som inkluderar entiteter med relaterade bifogade filer. Hämta posterna med , RetrieveMultiplemen hämta eventuella relaterade filer efter behov med hjälp av enskilda Retrieve åtgärder.

Minnesläckor

Ett mindre vanligt scenario är att koden i plugin-programmet läcker minne. Den här situationen kan inträffa när plugin-programmet inte skrivs som tillståndslöst, vilket är en annan metod. Mer information finns i Utveckla plugin-implementeringar som tillståndslösa. När plugin-programmet inte är tillståndslöst och det finns ett försök att kontinuerligt lägga till data i en tillståndskänslig egenskap som en matris, växer mängden data till den punkt där den använder allt tillgängligt minne.

Transaktionsfel

Det finns två vanliga typer av fel som rör transaktioner:

Felkod: -2146893812
Felmeddelande: ISV-koden minskade antalet öppna transaktioner. Anpassade plugin-program bör inte fånga undantag från OrganizationService-anrop och fortsätta bearbetningen.

Felkod: -2147220911
Felmeddelande: Det finns ingen aktiv transaktion. Det här felet orsakas vanligtvis av anpassade plugin-program som ignorerar fel från tjänstanrop och fortsätter bearbetningen.

Obs!

Det översta felet lades till senast. Det bör ske omedelbart och i samband med plugin-programmet som innehåller problemet. Det nedre felet kan fortfarande inträffa under olika omständigheter, vanligtvis med anpassade arbetsflödesaktiviteter. Det kan bero på problem i ett annat plugin-program.

När ett fel som rör en dataåtgärd inträffar inom ett synkront plugin-program avslutas transaktionen för hela åtgärden.

Mer information finns i Design för skalbar anpassning i Microsoft Dataverse.

En vanlig orsak är att en utvecklare tror att de kan försöka utföra en åtgärd som kan lyckas, så att de omsluter åtgärden i ett try/catch block och försöker svälja felet när det misslyckas.

Det här mönstret kan fungera för ett klientprogram, men vid körning av ett plugin-program resulterar eventuella dataåtgärdsfel i att hela transaktionen återställs. Du kan inte svälja felet, så du måste se till att alltid returnera en InvalidPluginExecutionException.

Felet "Sql-fel: Tidsgränsen för körningen har upphört att gälla"

Felkod: -2147204783
Felmeddelande: Sql-fel: "Tidsgränsen för körningen har upphört att gälla. Tidsgränsen uppnåddes innan åtgärden slutfördes eller så svarar inte servern."

Orsak

Det finns en mängd olika orsaker till varför ett SQL-timeoutfel kan uppstå. Tre av dem beskrivs här:

Blockera

Den vanligaste orsaken till ett SQL-timeoutfel är att åtgärden väntar på resurser som blockeras av en annan SQL-transaktion. Felet är resultatet av att Dataverse skyddar dataintegriteten och från långvariga begäranden som påverkar användarnas prestanda.

Blockering kan bero på andra samtidiga åtgärder. Koden kan fungera bra isolerat i en testmiljö och fortfarande vara mottaglig för villkor som bara inträffar när flera användare initierar logiken i plugin-programmet.

När du skriver plugin-program är det viktigt att du förstår hur du utformar anpassningar som är skalbara. Mer information finns i Design för skalbar anpassning i Dataverse.

Kaskadåtgärder

Vissa åtgärder som du gör i plugin-programmet, till exempel att tilldela eller ta bort en post, kan initiera sammanhängande åtgärder för relaterade poster. Dessa åtgärder kan tillämpa lås på relaterade poster som gör att efterföljande dataåtgärder blockeras, vilket i sin tur kan leda till en SQL-timeout.

Du bör överväga den möjliga effekten av dessa sammanhängande åtgärder på dataåtgärder i plugin-programmet. Mer information finns i Tabellrelationsbeteende.

Eftersom dessa beteenden kan konfigureras på olika sätt mellan miljöer kan beteendet vara svårt att återskapa om inte miljöerna konfigureras på samma sätt.

Index för nya tabeller

Om plugin-programmet utför åtgärder med hjälp av en tabell eller kolumn som skapades nyligen kan vissa Azure SQL funktioner för att hantera index göra skillnad efter några dagar.

Fel på grund av användarbehörigheter

I ett klientprogram kan du inaktivera kommandon som användarna inte får utföra. I ett plugin-program har du inte den här möjligheten. Koden kan innehålla viss automatisering som den anropande användaren inte har behörighet att utföra.

Du kan registrera plugin-programmet för att köras i kontexten för en användare som är känd för att ha rätt behörigheter genom att ange värdet Kör i användarens kontext till den användaren. Eller så kan du köra åtgärden genom att personifiera en annan användare. Mer information finns i:

Fel vid körning i kontexten för en inaktiverad användare

När ett plugin-program körs i kontexten för en inaktiverad användare returneras följande fel:

Felmeddelande: System.ServiceModel.FaultException'1[Microsoft.Xrm.Sdk.OrganizationServiceFault]: Användaren med SystemUserId=<User-ID> i OrganizationContext=<Context> är inaktiverad. Inaktiverade användare kan inte komma åt systemet. Överväg att aktivera den här användaren. Dessutom inaktiveras användare om de inte har tilldelats någon licens.

Om du vill felsöka det här felet kan du köra en fråga för att hitta de steg som registrerats för den inaktiverade användaren samt tillhörande plugin-program och SdkMessage information.

https://<env-url>/api/data/v9.2/sdkmessageprocessingsteps
?$filter=_impersonatinguserid_value eq '<disabled-userId-from-error>'&
$expand=plugintypeid($select=name,friendlyname,assemblyname;
$expand=pluginassemblyid($select=solutionid,name,isolationmode)),sdkmessageid($select=solutionid,name)&
$select=solutionid,name,stage,_impersonatinguserid_value,mode

Felmeddelandet "Meddelandestorleken överskreds när kontexten skickades till sandbox-miljön"

Felkod: -2147220970
Felmeddelande: Meddelandestorleken överskreds när kontexten skickades till sandbox-miljön. Meddelandestorlek: ### Mb

Det här felet uppstår när en nyttolast för meddelanden är större än 116,85 MB och ett plugin-program registreras för meddelandet. Felmeddelandet innehåller storleken på nyttolasten som orsakade felet.

Gränsen säkerställer att användare som kör program inte kan störa varandra baserat på resursbegränsningar. Gränsen hjälper till att ge en skyddsnivå mot ovanligt stora meddelandenyttolaster som hotar tillgängligheten och prestandaegenskaperna för Dataverse-plattformen.

116,85 MB är tillräckligt stort för att det ska vara ovanligt att stöta på det här fallet. Den mest sannolika situationen där det här fallet kan inträffa är när du hämtar en post med flera relaterade poster som innehåller stora binära filer.

Om du får det här felet kan du:

  1. Ta bort plugin-programmet för meddelandet. Om inga plugin-program har registrerats för meddelandet slutförs åtgärden utan fel.
  2. Om felet uppstår i en anpassad klient kan du ändra koden så att den inte försöker utföra arbetet i en enda åtgärd. Skriv i stället kod för att hämta data i mindre delar.

Felet "Den angivna nyckeln fanns inte i ordlistan"

Dataverse använder ofta klasser som härletts från den abstrakta DataCollection<TKey,TValue> klassen som representerar en samling nycklar och värden. Med plugin-program IExecutionContextär egenskapen .InputParameters till exempel en ParameterCollection härledd från DataCollection<TKey,TValue> klassen . De här klasserna är i princip ordlisteobjekt där du får åtkomst till ett visst värde med hjälp av nyckelnamnet.

Felkoder

Det här felet uppstår när nyckelvärdet i koden inte finns i samlingen. Resultatet är ett körningsfel snarare ett plattformsfel. När det här felet inträffar i ett plugin-program beror felkoden på om felet upptäcktes.

Om utvecklaren fångade undantaget och returnerade InvalidPluginExecutionException, enligt beskrivningen i Hantera undantag i plugin-program, returneras följande fel:

Felkod: -2147220891
Felmeddelande: ISV-koden avbröt åtgärden.

Men med det här felet är det vanligt att utvecklaren inte fångar upp det korrekt och att följande fel returneras:

Felkod: -2147220956
Felmeddelande: Ett oväntat fel uppstod från ISV-kod.

Obs!

"ISV" står för Independent Software Vendor.

Orsak

Det här felet inträffar ofta vid designtillfället och kan bero på att ett felstavat eller felaktigt hölje används. Nyckelvärdena är skiftlägeskänsliga.

Vid körning beror felet ofta på att utvecklaren antar att värdet finns när det inte är det. I ett plugin-program som registrerats för uppdateringen av en tabell ingår till exempel endast de värden som ändras i Entitysamlingen .Attributes

Åtgärd

För att lösa det här felet måste du kontrollera att nyckeln finns innan du försöker använda den för att komma åt ett värde.

När du till exempel öppnar en tabellkolumn kan du använda Entitymetoden .Contains(String) för att kontrollera om det finns en kolumn i en tabell, som du ser i följande kod.

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

// The InputParameters collection contains all the data passed in the message request.  
if (context.InputParameters.Contains("Target") &&
    context.InputParameters["Target"] is Entity)
    {
    // Obtain the target entity from the input parameters.  
    Entity entity = (Entity)context.InputParameters["Target"];

    //Check whether the name attribute exists.
    if(entity.Contains("name"))
    {
        string name = entity["name"];
    }

Vissa utvecklare använder Entitymetoden .GetAttributeValue<T>(String) för att undvika det här felet vid åtkomst till en tabellkolumn. Den här metoden returnerar standardvärdet för typen om kolumnen inte finns. Om standardvärdet är null fungerar den här metoden som förväntat. Men om standardvärdet inte returnerar null, till exempel med ett DateTime, är 1/1/0001 00:00 det returnerade värdet i stället för null.

Felet "Du kan inte starta en transaktion med en annan isoleringsnivå än vad som redan har angetts för den aktuella transaktionen"

Felkod: -2147220989
Felmeddelande: Du kan inte starta en transaktion med en annan isoleringsnivå än vad som redan har angetts för den aktuella transaktionen

Plugin-program är avsedda att stödja affärslogik. Det går inte att ändra någon del av dataschemat i ett synkront plugin-program. Dessa åtgärder tar ofta längre tid och kan göra att cachelagrade metadata som används av program blir osynkroniserade. Dessa åtgärder kan dock utföras i ett plugin-steg som registrerats för att köras asynkront.

Känt problem: Namnvärdet Activity.RegardingObjectId har inte angetts med plugin-programmet

Det vanligaste symptomet på det här problemet är att fältet Angående i en aktivitetspost visas (No Name) i stället för det primära namnattributvärdet.

I ett plugin-program kan du ange uppslagsattribut med ett EntityReference-värde . Egenskapen EntityReference.Name krävs inte. Vanligtvis behöver du inte inkludera det när du anger ett uppslagsattributvärde eftersom Dataverse anger det. Du bör ange värden som dessa under PreOperation-fasen i händelsepipelinen. Mer information finns i Pipeline för händelsekörning.

Undantaget till den här regeln är när du anger ActivityPointer.RegardingObjectId-sökningen . Alla entitetstyper som härleds från ActivityPointer ärver den här sökningen. Dessa inkluderar som standard Avtalad tid, Chatt, Email, Fax, Brev, PhoneCall, RecurringAppointmentMaster och alla anpassade tabeller som har skapats som aktivitetstyper. Mer information finns i Aktivitetstabeller.

Om du anger det här värdet i PreOperation-fasen läggs inte namnvärdet till av Dataverse. Värdet är null och det formaterade värdet som ska innehålla det här värdet finns inte när du hämtar posten.

Lösning

Det finns två sätt att kringgå det här problemet:

  1. Du kan ange EntityReference.Name egenskapsvärdet med rätt primärt namnfältvärde innan du anger värdet för uppslagsattributet.
  2. Du kan ange uppslagsvärdet i fasen PreValidation i stället för PreOperation-fasen .

Mer information