Olvasás angol nyelven

Megosztás a következőn keresztül:


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.

Megoldás előkészítése

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);
}

Megoldás importálása

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
    }
}

Megoldás exportálása

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);

Lásd még

Minta: Megoldás előkészítése aszinkron importálással