Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Har du någon gång kört på situationen under importen eller exporten av en stor lösning där åtgärden är ett annat fel? I så fall kan du välja att utföra lösningsimporten/-exporten asynkront. Det här avsnittet beskriver hur du initierar den asynkrona importen eller exporten med hjälp av Dataverse SDK för .NET och Web API.
Skapa en lösning
I jämförelse med att importera en lösning där lösningen importeras och är tillgänglig i miljön på en gång, bryts importen till mer kontrollerbara faser. Mellanlagringsprocessen importerar lösningen som en "intryckt"-lösning där administratören kan bestämma när den stegvisa lösningen ska göras tillgänglig för användarna, eller för att utföra en uppgradering (i fallet med en lösningsuppgradering) i målmiljön. En del av mellanlagringsprocessen är validering av den mellanlagrade lösningen. På så sätt kan du arrangera lösningen, känna till att lösningen är giltig och schemalägga när lösningen ska tillämpas eller uppgradera till målmiljön.
| Operation | Webb-API | Dataverse SDK för .NET |
|---|---|---|
| Mellanlagra en lösning | StageSolution (på engelska) | StageSolutionRequest (på engelska) |
Resultatet av testlösningen blir en samling med valideringsresultat som anger framgång eller fel och (om det lyckas) en StageSolutionUploadId som ska användas i samtalet ImportSolutionAsync. Se exempelkoden för webb-API för importlösningen ovan för ett exempel på hur du gör.
public static StageSolutionResults StageSolution(
IOrganizationService service,
string solutionFilePath)
{
// Stage the solution
var req = new StageSolutionRequest();
byte[] fileBytes = File.ReadAllBytes(solutionFilePath);
req["CustomizationFile"] = fileBytes;
var res = service.Execute(req);
return (res["StageSolutionResults"] as StageSolutionResults);
}
Lösningsimport
ImportSolution är den åtgärd (eller det meddelande) som utför den synkrona importåtgärden. För att utföra importoperationen asynkront använd ImportSolutionAsync.
| Operation | Webb-API | Dataverse SDK för .NET |
|---|---|---|
| Importera en lösning | ImportSolutionAsync | ImportSolutionAsyncRequest |
Nu ska vi ta en titt på ett exempel på en kod som demonstrerar ImportSolutionAsync.
public static ImportSolutionAsyncResponse ImportSolution(
IOrganizationService service,
StageSolutionResults stagingResults,
Dictionary<string,Guid> connectionIds,
Dictionary<string,string> envarValues )
{
// Import the staged solution
var componentDetails = stagingResults.SolutionComponentsDetails;
// TODO These are not referenced in the code but are useful to explore
var missingDependencies = stagingResults.MissingDependencies; // Contains missing dependencies
var solutionDetails = stagingResults.SolutionDetails; // Contains solution details
var connectionReferences = componentDetails.Where(x => string.Equals(x.ComponentTypeName, "connectionreference"));
var envVarDef = componentDetails.Where(x => string.Equals(x.ComponentTypeName, "environmentvariabledefinition"));
var envVarValue = componentDetails.Where(x => string.Equals(x.ComponentTypeName, "environmentvariablevalue"));
var componentParams = new EntityCollection();
// Add each connection reference to the component parmameters entity collection.
foreach (var conn in connectionReferences)
{
var e = new Entity("connectionreference")
{
["connectionreferencelogicalname"] = conn.Attributes["connectionreferencelogicalname"].ToString(),
["connectionreferencedisplayname"] = conn.Attributes["connectionreferencedisplayname"].ToString(),
["connectorid"] = conn.Attributes["connectorid"].ToString(),
["connectionid"] = connectionIds[conn.ComponentName]
};
componentParams.Entities.Add(e);
}
// Add each environment variable to the component parmameters entity collection.
foreach (var value in envVarValue)
{
var e = new Entity("environmentvariablevalue")
{
["schemaname"] = value.Attributes["schemaname"].ToString(),
["value"] = envarValues[value.ComponentName]
};
if (value.Attributes.ContainsKey("environmentvariablevalueid"))
{
e["environmentvariablevalueid"] = value.Attributes["environmentvariablevalueid"].ToString();
}
componentParams.Entities.Add(e);
}
// Import the solution
var importSolutionReq = new ImportSolutionAsyncRequest();
importSolutionReq.ComponentParameters = componentParams;
importSolutionReq.SolutionParameters = new SolutionParameters { StageSolutionUploadId = stagingResults.StageSolutionUploadId };
var response = service.Execute(importSolutionReq) as ImportSolutionAsyncResponse;
return (response);
}
ImportSolutionAsync delar många indataparametrar med ImportSolution men lägger till ComponentParameters och SolutionParameters.
ComponentParameters kan användas för att skriva över komponentdata i lösningens XML-anpassningsfil.
SolutionParameters kan användas för att skicka en StageSolutionUploadId mellanlagrad lösning som visas i exemplet på webb-API-kod. Mer information: mellanlagra en lösning
Svaret som returneras från ImportSolutionAsync innehåller ImportJobKey och AsyncOperationId. Värdet ImportJobKey kan användas för att hämta importresultatet och värdet AsyncOperationId kan användas för att spåra status för importjobbet.
public static void CheckImportStatus(
IOrganizationService service,
Guid asyncOperationId,
Guid importJobKey)
{
// Get solution import status
var finished = false;
Entity asyncOperation = null;
// Wait until the async job is finished
while (!finished)
{
asyncOperation = service.Retrieve("asyncoperation", asyncOperationId, new ColumnSet("statecode", "statuscode"));
OptionSetValue statecode = (OptionSetValue)asyncOperation["statecode"];
if (statecode.Value == 3)
{
finished = true;
}
else
{
Thread.Sleep(10000);
}
}
// Solution import completed successfully
OptionSetValue statuscode = (OptionSetValue)asyncOperation["statuscode"];
if (statuscode.Value == 30)
{
Console.WriteLine("The solution import completed successfully.");
}
else if (asyncOperation["statuscode"].ToString() == "31") // Solution import failed
{
Console.WriteLine("The solution import failed.");
var getLogReq = new RetrieveFormattedImportJobResultsRequest { ImportJobId = importJobKey };
var importJob = service.Execute(getLogReq) as RetrieveFormattedImportJobResultsResponse;
// TODO Do something with the import job results
}
}
Lösningsexport
ExportSolution är den åtgärd (eller det meddelande) som utför den synkrona exportåtgärden. För att utföra exportoperationen asynkront använd ExportSolutionAsync.
| Operation | Webb-API | Dataverse SDK för .NET |
|---|---|---|
| Exportera en lösning | ExporteraSolutionAsync | ExporteraSolutionAsyncRequest |
| Hämta en exporterad lösningsfil | Ladda nerLösningExportData | Ladda nerLösningExporteraDataRequest |
Nu ska vi ta en titt på ett exempel på en kod som demonstrerar ExportSolutionAsync.
// Where 'service' is a pre-configured IOrganizationService instance.
var service = (OrganizationServiceProxy)xsc.CreateOrganizationService();
var req = new OrganizationRequest("ExportSolutionAsync");
req.Parameters.Add("SolutionName", "ExportSolutionAsyncTest");
req.Parameters.Add("Managed", false);
var response = service.Execute(req);
I svaret finns värdena och AsyncOperationId och ExportJobId parametern. Använd AsyncOperationId i svaret för att kontrollera att det asynkrona jobbet har lyckats (statecode == 3; statuscode == 30). Använd sedan åtgärden DownloadSolutionExportData (eller meddelandet) med värdet ExportJobId från exportsvaret för att hämta den exporterade lösningsfilen, som returneras i parametern ExportSolutionFile.
// Where 'service' is a pre-configured IOrganizationService instance.
var service = (OrganizationServiceProxy)xsc.CreateOrganizationService();
var req = new OrganizationRequest("DownloadSolutionExportData");
req.Parameters.Add("ExportJobId", Guid.Parse("a9089b53-a1c7-ea11-a813-000d3a14420d");
var response = service.Execute(req);