Megoldások előkészítése aszinkron importálással és exportálással
Volt már olyan helyzetben, hogy nagy megoldás importálása vagy exportálása során lejárt a művelet időkorlátja? Ha igen, akkor a megoldás importálásának/exportálásának aszinkron végrehajtása érdekelheti Önt. A témakör ismerteti, hogyan lehet az aszinkron importálást vagy exportálást Dataverse SDK for .NET és webes API-k használatával kezdeményezni.
Ahhoz képest, amikor egy megoldást úgy importál, hogy a megoldás importálásakor az azonnal elérhető a környezetben, az előkészítás az importálási folyamatot több szabályozható fázisra osztja. Az előkészítési folyamat „tároló” megoldásként importálja a megoldást, ahol a rendszergazda eldöntheti, hogy az előkészített megoldást mikor teszi elérhetővé a felhasználóknak, vagy mikor hajtson végre egy frissítést (ebben az esetben egy megoldásfrissítést) a célkörnyezetben. Az előkészítési folyamat része az előkészített megoldás ellenőrzése. Így előkészítheti a megoldást, tudhatja, hogy a megoldás érvényes, és ütemezheti, hogy mikor kell alkalmazni az adott megoldást, illetve mikor kell frissíteni a célkörnyezetre.
Operation | Webes API | Dataverse SDK for .NET |
---|---|---|
Megoldás előkészítése | StageSolution | StageSolutionRequest |
A megoldás előkészítése a sikeresség vagy sikertelenség ellenőrzéseredményeinek kollekciója lesz, és (siker esetén) egy StageSolutionUploadId
fognak használni az ImportSolutionAsync
hívás során. Ennek a műveletnek a példáját a fenti importmegoldás webes API-mintakódjában láthatja.
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);
}
ImportSolution
az a művelet (vagy üzenet), amely végrehajtja a szinkron importálási műveletet. Az importálási művelet aszinkron végrehajtásához használja az ImportSolutionAsync
lehetőséget.
Operation | Webes API | Dataverse SDK for .NET |
---|---|---|
Megoldás importálása | ImportSolutionAsync | ImportSolutionAsyncRequest |
Most vessünk egy pillantást az ImportSolutionAsync
lehetőséget szemléltető példakódra.
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
Számos bemeneti paramétert oszt meg a de ImportSolution
hozzáad ComponentParameters
és SolutionParameters
. ComponentParameters
segítségével felülírhatja az összetevőadatokat a megoldás testreszabási XML-fájljában. SolutionParameters
egy szakaszos megoldás átadására StageSolutionUploadId
használható, ahogy az a példa webes API-kódban is látható. További információk a Megoldás előkészítése részben találhatók
Az ImportSolutionAsync
visszaküldött válasza tartalmazza az ImportJobKey
és AsyncOperationId
elemeket. Az ImportJobKey
érték használható az importálás eredményének lekéréséhez, illetve az AsyncOperationId
érték használható az importálási feladat állapotának nyomon követésére.
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
}
}
ExportSolution
az a művelet (vagy üzenet), amely végrehajtja a szinkron exportálási műveletet. Az exportálási művelet aszinkron végrehajtásához használja az ExportSolutionAsync
lehetőséget.
Operation | Webes API | Dataverse SDK for .NET |
---|---|---|
Megoldás exportálása | ExportSolutionAsync | ExportSolutionAsyncRequest |
Exportált megoldásfájl letöltése | DownloadSolutionExportData | DownloadSolutionExportDataRequest |
Most vessünk egy pillantást az ExportSolutionAsync
lehetőséget szemléltető példakódra.
// 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);
A válaszban találhatók az AsyncOperationId
és az ExportJobId
paraméterértékek. A válaszban használja az AsyncOperationId
lehetőséget az aszinkron feladat sikerességének ellenőrzéséhez (statecode
== 3; statuscode
== 30). Ezután használja a DownloadSolutionExportData
műveletet (vagy üzenetet) az exportválasz ExportJobId
értékével a ExportSolutionFile
paraméterbe visszadott, exportált megoldásfájl letöltéséhez.
// 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);