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