הערה
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות להיכנס או לשנות מדריכי כתובות.
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות לשנות מדריכי כתובות.
האם נתקלת פעם, במהלך ייבוא או ייצוא של פתרון גדול, במצב שבו תם פרק הזמן הקצוב לפעולה? אם כן, ייתכן שתהיה מועמד מושלם לביצוע אסינכרוני של ייבוא/ייצוא הפתרון. נושא זה מתאר כיצד ניתן לאתחל ייבוא או ייצוא אסינכרוני באמצעות Dataverse SDK עבור .NET וממשקי Web API.
אחסון זמני של פתרון
בהשוואה לייבוא של פתרון כאשר הפתרון מיובא וזמין מיד בסביבה, האחסון הזמני מפרק את תהליך הייבוא לשלבים נוחים יותר לתפעול. תהליך האחסון הזמני מייבא את הפתרון כפתרון "מכיל", שבו מנהל המערכת יכול להחליט מתי להפוך את הפתרון המאוחסן לזמין למשתמשים, או לבצע שדרוג (במקרה של שדרוג פתרון) בסביבת היעד. חלק מתהליך האחסון הזמני הוא האימות של הפתרון המאוחסן. בצורה זו תוכל לבצע אחסון זמני של הפתרון, לדעת שהפתרון חוקי ולתזמן את מועד החלת הפתרון או שדרוגו לסביבת היעד.
| פעולה | API של אינטרנט | Dataverse SDK עבור .NET |
|---|---|---|
| אחסון זמני של פתרון | פתרון הבמה | בקשת פתרון בשלבים |
התוצאה של האחסון הזמני של הפתרון תהיה אוסף של תוצאות אימות המצביעות על הצלחה או כישלון וכן (במקרה של הצלחה) StageSolutionUploadId שישמש בקריאה ל- ImportSolutionAsync. לקבלת דוגמה לביצוע פעולה זו, ראה את הקוד לדוגמה של Web API של פתרון הייבוא לעיל.
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 היא הפעולה (או ההודעה) שמבצעת את פעולת הייבוא הסינכרונית. כדי לבצע את פעולת הייבוא באופן אסינכרוני השתמש ב- ImportSolutionAsync.
| פעולה | API של אינטרנט | Dataverse SDK עבור .NET |
|---|---|---|
| ייבוא פתרון | ייבוא פתרון אסינכרוני | בקשת ייבוא פתרון אסינכרונית |
כעת נבחן קוד לדוגמה שמדגים את 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 חולק פרמטרים רבים של קלט עם ImportSolution אבל מוסיף ComponentParameters ו SolutionParameters.
ComponentParameters ניתן להשתמש בו כדי להחליף את נתוני הרכיב בקובץ ה-XML להתאמה אישית של הפתרון.
SolutionParameters ניתן להשתמש בו כדי להעביר את StageSolutionUploadId של פתרון בשלבים כפי שהוצג בקוד ה-API של האינטרנט לדוגמה. מידע נוסף: אחסון זמני של פתרון
התשובה שחזרה מ- ImportSolutionAsync מכילה ImportJobKey ו- AsyncOperationId. אפשר להשתמש בערך ImportJobKey כדי לקבל את תוצאת הייבוא וערך AsyncOperationId יכול לשמש למעקב אחר מצב משימת הייבוא.
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 היא הפעולה (או ההודעה) שמבצעת את פעולת הייצוא הסינכרונית. כדי לבצע את פעולת הייצוא באופן אסינכרוני השתמש ב- ExportSolutionAsync.
| פעולה | API של אינטרנט | Dataverse SDK עבור .NET |
|---|---|---|
| ייצוא פתרון | ייצוא פתרון אסינכרוני | בקשת ייצוא פתרון אסינכרונית |
| הורדת קובץ פתרון מיוצא | הורדת פתרון ייצוא נתונים | הורדת פתרון ייצוא נתונים בקשת |
כעת נבחן קוד לדוגמה שמדגים את 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);
בתגובה מופיעים ערכי הפרמטרים AsyncOperationId ו- ExportJobId. השתמש ב- AsyncOperationId בתגובה כדי לאמת את ההצלחה (statecode == 3; statuscode == 30) של המשימה האסינכרונית. כעת, השתמש בפעולה (או הודעה) DownloadSolutionExportData עם ערך ExportJobId מתגובת הייצוא כדי להוריד את קובץ הפתרון המיוצא, שחזר בפרמטר 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);