Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
¿Alguna vez se ha encontrado con la situación durante la importación o exportación de una solución grande en la que se agota el tiempo de espera de la operación? Si es así, puede optar por realizar la importación/exportación de la solución de forma asincrónica. Este tema describe cómo iniciar la importación o exportación asincrónicas usando el SDK de Dataverse para .NET y API web.
Preparar una solución
En comparación con la importación de una solución, donde la solución se importa y está disponible en el entorno de inmediato, la preparación divide el proceso de importación en fases más controlables. El proceso de preparación importa la solución como una solución de "retención" en la que Administrador puede decidir cuándo hacer que la solución preparada esté disponible para los usuarios o realizar una actualización (en el caso de una actualización de la solución) en el entorno de destino. Parte del proceso de preparación es la validación de la solución preparada. De esta forma, puede organizar la solución, saber que la solución es válida y programar cuándo aplicar esa solución o actualizar al entorno de destino.
| Operación | API web | SDK de Dataverse para .NET |
|---|---|---|
| Preparar una solución | Solución de escenario | Solicitud de solución de etapa |
El resultado de la preparación de la solución será una colección de resultados de validación que indiquen el éxito o el fracaso y (si tiene éxito) una StageSolutionUploadId que se usará en la llamada de ImportSolutionAsync. Consulte el código de muestra de la API web de la solución de importación anterior para ver un ejemplo de cómo se hace esto.
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);
}
Importación de solución
ImportSolution es la acción (o mensaje) que realiza la operación de importación sincrónica. Para ejecutar la operación de importación de forma asincrónica, utilice ImportSolutionAsync.
| Operación | API web | SDK de Dataverse para .NET |
|---|---|---|
| Importación de una solución | ImportarSoluciónAsync | Solicitud asíncrona de importación de solución |
Ahora echemos un vistazo a un código de ejemplo que demuestra 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 comparte muchos parámetros de entrada con ImportSolution pero añade ComponentParameters y SolutionParameters.
ComponentParameters se puede utilizar para sobrescribir los datos del componente en el archivo XML de personalización de la solución.
SolutionParameters se puede utilizar para pasar el StageSolutionUploadId de una solución por etapas como se muestra en el código de API web de ejemplo. Más información: Preparar una solución
La respuesta devuelta de ImportSolutionAsync contiene ImportJobKey y AsyncOperationId. El valor ImportJobKey puede utilizarse para obtener el resultado de la importación y el valor AsyncOperationId se puede utilizar para realizar un seguimiento del estado del trabajo de importación.
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
}
}
Exportación de la solución
ExportSolution es la acción (o mensaje) que realiza la operación de exportación sincrónica. Para ejecutar la operación de exportación de forma asincrónica, utilice ExportSolutionAsync.
| Operación | API web | SDK de Dataverse para .NET |
|---|---|---|
| Exportación de soluciones | ExportSolutionAsync | Solicitud asíncrona de solución de exportación |
| Descargar un archivo de solución exportado | DescargarSoluciónExportarDatos | DescargarSoluciónExportarDatosSolicitar |
Ahora echemos un vistazo a un código de ejemplo que demuestra 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);
En la respuesta están los valores de parámetros AsyncOperationId y ExportJobId. Use AsyncOperationId en la respuesta para verificar el éxito (statecode == 3; statuscode == 30) del trabajo asincrónico. A continuación, utilice la acción DownloadSolutionExportData (o mensaje) con el valor ExportJobId de la respuesta de exportación para descargar el archivo de solución exportado, que se devuelve en el parámetro 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);
Vea también
Ejemplo: Preparación de la solución con importación asincrónica