Felsöka plugin-program för Dataverse
Den här artikeln innehåller information om fel som kan uppstå vid plugin-körning eller Dataverse-fel som är relaterade till plugin-program och hur du undviker eller åtgärdar dem.
Felet "Tidskonverteringen kunde inte slutföras"
Felkod: -2147220956
Felmeddelande: Konverteringen kunde inte slutföras eftersom den angivna DataTime inte hade egenskapen Kind korrekt inställd. När 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 Worker-processen 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 kraschdumparen 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
- Använda trådar för att köa arbete utan försök/fånga i tråddelegat
- Stack Overflow-fel i plugin-programmet
- Arbetsprocessen når minnesgränsen
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 korrekt avsluta åtgärden 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. Om du vill 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 konfigurationen osäker 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ånga 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 loggning av plugin-krascher automatiskt.
Mer information finns i Exportera data till Application Insights.
När en Application Insights-miljö har länkats blir följande data från en arbetsprocesskrasch tillgängliga för felsökning av problemet.
Så här navigerar du till kraschrapporten i Application Insights:
- Länka Application Insights till din miljö.
- Vänta tills ett plugin-undantag resulterar i kraschfelet i arbetsprocessen.
- Gå till Application Insights i administrationscentret för Power Platform.
- På sidan Application Insights väljer du Fel i den vänstra panelen.
- På sidan Fel väljer du Undantag.
- Under Undantagsproblem-ID går du till listan Övergripande och väljer Microsoft.PowerPlatform.Dataverse.Plugin.PluginWorkerCrashException.
- Till höger på sidan väljer du PluginWorkerCrashException under Övergripande. Nu visas information om alla registrerade undantag för arbetsprocesskrascher.
- Sök efter och välj önskat undantag i den vänstra panelen, och undantagsinformationsrapporten visas till höger på sidan (se föregående skärmbild för ett exempel).
- 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 ändrat plugin-koden. Vissa använder sina egna 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 det här felet. Mer information finns i Klasskommentarer för StackOverflowException>.
Du bör granska eventuella kodändringar som nyligen har tillämpats 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 och försöken att samla in felet används 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 tidigare visades 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& 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: #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& wcfExecInMs, Int64& initializeInMs, Int64& trackCallInMs, Int64& trackGoodReturnInMs, Int64& waitInMs, Int64& 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 den här är oförutsägbar eftersom 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 slag körs samtidigt blir mängden minne som krävs stort. Om mängden minne överskrider gränsen kraschar processen. Nyckeln till att förhindra den här situationen är att RetrieveMultiple
begränsa frågor som innehåller entiteter med relaterade filbilagor. Hämta posterna med , RetrieveMultiple
men 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 görs 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 det 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.
Kommentar
Det översta felet har lagts till senast. Det bör inträffa 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 Skalbar anpassningsdesign 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 i körningen 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 har förflutit innan åtgärden har slutförts eller så svarar inte servern."
Orsak
Det finns en mängd olika orsaker till varför ett SQL-timeoutfel kan inträffa. Tre av dem beskrivs här:
Blockering
Den vanligaste orsaken till ett SQL-timeoutfel är att åtgärden väntar på resurser som blockerats 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 känslig för villkor som endast 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 Skalbar anpassningsdesign i Dataverse.
Kaskadåtgärder
Vissa åtgärder som du utfö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 nyligen har skapats 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örighet 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. Användarna är också inaktiverade 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 meddelandenyttolast är större än 116,85 MB och ett plugin-program har registrerats för meddelandet. Felmeddelandet innehåller storleken på nyttolasten som orsakade felet.
Gränsen hjälper till att säkerställa 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:
- Ta bort plugin-programmet för meddelandet. Om inga plugin-program har registrerats för meddelandet slutförs åtgärden utan ett fel.
- 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 har fastnat.
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 det korrekt och följande fel returneras:
Felkod: -2147220956
Felmeddelande: Ett oväntat fel uppstod från ISV-koden.
Kommentar
"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 är registrerat 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 kommer åt en tabellkolumn kan du använda Entitymetoden .Contains(String) för att kontrollera om en kolumn finns 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 leda till 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, E-post, 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:
- Du kan ange egenskapsvärdet EntityReference.Name med rätt primärt namnfältvärde innan du anger värdet för uppslagsattributet.
- Du kan ange uppslagsvärdet i fasen PreValidation i stället för PreOperation-fasen.