Baca dalam bahasa Inggris

Bagikan melalui


Penahapan solusi, dengan impor dan ekspor asinkron

Pernahkah Anda mengalami situasi selama mengimpor atau mengekspor solusi besar dengan waktu pengoperasian habis? Jika demikian, Anda mungkin menjadi calon untuk melakukan impor/ekspor solusi secara asinkron. Topik ini menjelaskan cara memulai impor atau ekspor asinkron menggunakan Dataverse SDK untuk .NET dan API Web.

Menahapkan solusi

Dibandingkan dengan mengimpor solusi yang segera diimpor dan tersedia di lingkungan, penahapan akan memecah proses impor menjadi fase yang lebih dapat dikontrol. Proses penahapan mengimpor solusi sebagai solusi "memegang" yang dapat administrator tentukan kapan membuat solusi yang ditahap tersedia untuk pengguna, atau untuk melakukan peningkatan (dalam kasus peningkatan solusi) di lingkungan target. Bagian dari proses penahapan adalah validasi solusi bertahapan. Dengan cara ini, Anda dapat menahap solusi, mengetahui solusinya valid, dan menjadwalkan kapan menerapkan solusi untuk peningkatan ke lingkungan target.

Operasi API Web Dataverse SDK untuk .NET
Menahapkan solusi Solusi Panggung Permintaan Solusi Tahap

Hasil penahapan solusi adalah kumpulan hasil validasi yang menunjukkan berhasil atau tidaknya dan (jika berhasil) StageSolutionUploadId untuk digunakan dalam panggilan ImportSolutionAsync. Lihat kode sampel API Web solusi impor di atas untuk contoh penerapannya.

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

Impor Solusi

ImportSolution adalah tindakan (atau pesan) yang melakukan operasi impor sinkron. Untuk menjalankan operasi impor yang asinkron, gunakan ImportSolutionAsync.

Operasi API Web Dataverse SDK untuk .NET
Mengimpor solusi ImportSolutionAsync ImportSolutionAsyncRequest

Sekarang lihat beberapa kode contoh yang menunjukkan 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 berbagi banyak parameter input dengan ImportSolution tetapi menambahkan ComponentParameters dan SolutionParameters. ComponentParameters dapat digunakan untuk menimpa data komponen dalam file XML penyesuaian solusi. SolutionParameters dapat digunakan untuk meneruskan StageSolutionUploadId solusi bertahap seperti yang ditunjukkan dalam contoh kode API Web. Informasi selengkapnya: Menahapkan solusi

Respons yang didapat dari ImportSolutionAsync berisi ImportJobKey dan AsyncOperationId. Nilai ImportJobKey dapat digunakan untuk memperoleh hasil impor dan nilai AsyncOperationId dapat digunakan untuk melacak status pekerjaan impor.

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

Ekspor Solusi

ExportSolution adalah tindakan (atau pesan) yang melakukan operasi ekspor sinkron. Untuk menjalankan operasi ekspor yang asinkron, gunakan ExportSolutionAsync.

Operasi API Web Dataverse SDK untuk .NET
Mengekspor solusi ExportSolutionAsync ExportSolutionAsyncRequest
Mengunduh file solusi yang diekspor UnduhSolusiEksporData Unduh SolusiEksporDataPermintaan

Sekarang lihat beberapa kode contoh yang menunjukkan 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);

Pada respons adalah nilai parameter AsyncOperationId dan ExportJobId. Gunakan AsyncOperationId pada respons untuk memverifikasi keberhasilan (statecode == 3; statuscode == 30) pekerjaan asinkron. Selanjutnya, gunakan tindakan DownloadSolutionExportData (atau pesan) dengan ExportJobId dengan nilai dari respons ekspor untuk mengunduh file solusi yang diekspor, yang dikembalikan dalam parameter 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);

Lihat Juga

Sampel: Pementasan solusi dengan impor asinkron