Ejemplo: importar archivos como recursos web
Cuando desarrolle un gran número de archivos para usar como recursos web, puede ahorrarse el trabajo de agregarlos manualmente en toda la aplicación. Muchos recursos web pueden desarrollarse y probarse fuera de aplicaciones basadas en modelos y luego se importan.
Esta muestra ofrece un ejemplo simplificado de este proceso.
Descargue el ejemplo: Importar archivos como recursos web.
Requisitos previos
Se requiere una conexión a Internet para descargar el proyecto de ejemplo y para restablecer los paquetes NuGet que se usan en el proyecto de ejemplo.
Requisitos
El código de muestra que se incluye en el paquete de descarga de SDK incluye los siguientes archivos necesarios para esta muestra:
ImportJob.xml
Este archivo proporciona datos de los registros de recursos web que se crearán. Contiene los siguientes datos para cada archivo:
path: la ruta de acceso a cada archivo desde la carpeta FilesToImport.
displayName: El nombre del recurso web.
descripción: Una descripción de lo que hace cada archivo.
nombre: El nombre que se usará para el recurso web.
Nota
- Cada uno de estos nombres comienza con un carácter de subrayado. El prefijo de personalización del editor de soluciones se antepondrá al nombre cuando se cree el recurso web. En lugar de codificar rígidamente un prefijo de personalización específico, esta muestra detectará el prefijo de personalización actual para un registro de editor que ya existe en la organización.
- Dado que cada uno de estos archivos se desarrolló fuera de aplicaciones basadas en modelos y dependen de las rutas relativas para acceder a la otra ruta, los nombres incluyen los caracteres de barra diagonal inversa "/" para crear una estructura de carpeta virtual de modo que los vínculos relativos seguirán funcionando dentro de aplicaciones basadas en modelos.
- Cada uno de estos nombres comienza con un carácter de subrayado. El prefijo de personalización del editor de soluciones se antepondrá al nombre cuando se cree el recurso web. En lugar de codificar rígidamente un prefijo de personalización específico, esta muestra detectará el prefijo de personalización actual para un registro de editor que ya existe en la organización.
type: especifica el tipo de recurso web que crear con los valores enteros encontrados en Tipos de recursos web.
FilesToImport/ShowData.htm
Este recurso web HTML requiere que cada uno de los demás archivos muestre la tabla siguiente.
Nombre de pila | Apellido |
---|---|
Apurva | Dalia |
Ofer | Daliot |
Jim | Daly |
Ryan | Danner |
Mike | Danseglio |
Alex | Darrow |
FilesToImport/CSS/Styles.css
Este archivo proporciona los estilos CSS que se usan en ShowData.htm.
FilesToImport/Data/Data.xml
Este archivo contiene la lista de nombres que se muestra en la tabla.
FilesToImport/script/Script.js
Este archivo contiene una biblioteca JScript que contiene información sobre la ubicación relativa del archivo Data.xml y del archivo Transform.xslt. También contiene la función de showData
que transforma los datos y los agrega a la página de ShowData.htm.
FilesToImport/XSL/Transform.xslt
Este archivo contiene la definición de XSL sobre cómo transformar los datos en una tabla HTML.
Demostraciones
Creación de recursos web en el contexto de una solución
Los recursos web son registros propiedad de la organización por lo que se pueden crear utilizando el método IOrganizationService.Create o usando el mensaje CreateRequest y el método IOrganizationService.Execute. Este ejemplo muestra cómo usar el parámetro opcional SolutionUniqueName
para asociar un recurso web con una solución específica cuando se crea. Usar un parámetro opcional requiere usar el mensaje CreateRequest.
Carga de archivos desde el disco
La propiedad WebResource.Content requiere una cadena de base 64 que representa los contenidos binarios del archivo. El siguiente ejemplo es el método usado para convertir el archivo en el tipo requerido.
//Encodes the Web Resource File
static public string getEncodedFileContents(String pathToFile)
{
FileStream fs = new FileStream(pathToFile, FileMode.Open, FileAccess.Read);
byte[] binaryData = new byte[fs.Length];
long bytesRead = fs.Read(binaryData, 0, (int)fs.Length);
fs.Close();
return System.Convert.ToBase64String(binaryData, 0, binaryData.Length);
}
Combinar datos de registro del recurso web con datos de archivo
El archivo ImportJob.xml demuestra cómo se combinan los datos de los archivos que se importarán y los datos del recurso web que se creará. En especial, para que vínculos relativos entre los archivos relacionados sigan funcionando, el nombre de los recursos web que cree debe conservar la información acerca la posición relativa de los archivos en el disco mediante directorios simulados en el nombre de archivo. Debido a los datos en el archivo ImportJob.xml, todos estos archivos de recursos web relacionados se crearán en una carpeta virtual común.
Nota
No es necesario publicar los recursos web cuando se crean. No obstante, es necesario publicarlos cuando se actualizan.
Ejemplo
La siguiente parte del archivo ImportWebResources.cs espera las siguientes variables:
_customizationPrefix
: el prefijo de personalización del editor de Ejemplos del SDK. Si este editor no existe, se creará con el prefijo de personalización "ejemplo"._ImportWebResourcesSolutionUniqueName
: El nombre único Importar solución de muestra de recursos web creado en este ejemplo. El valor esImportWebResourcesSample
.
//Read the descriptive data from the XML file
XDocument xmlDoc = XDocument.Load("../../ImportJob.xml");
//Create a collection of anonymous type references to each of the Web Resources
var webResources = from webResource in xmlDoc.Descendants("webResource")
select new
{
path = webResource.Element("path").Value,
displayName = webResource.Element("displayName").Value,
description = webResource.Element("description").Value,
name = webResource.Element("name").Value,
type = webResource.Element("type").Value
};
// Loop through the collection creating Web Resources
int counter = 0;
foreach (var webResource in webResources)
{
//Set the Web Resource properties
WebResource wr = new WebResource
{
Content = getEncodedFileContents(@"../../" + webResource.path),
DisplayName = webResource.displayName,
Description = webResource.description,
Name = _customizationPrefix + webResource.name,
LogicalName = WebResource.EntityLogicalName,
WebResourceType = new OptionSetValue(Int32.Parse(webResource.type))
};
// Using CreateRequest because we want to add an optional parameter
CreateRequest cr = new CreateRequest
{
Target = wr
};
//Set the SolutionUniqueName optional parameter so the Web Resources will be
// created in the context of a specific solution.
cr.Parameters.Add("SolutionUniqueName", _ImportWebResourcesSolutionUniqueName);
CreateResponse cresp = (CreateResponse)_serviceProxy.Execute(cr);
// Capture the id values for the Web Resources so the sample can delete them.
_webResourceIds[counter] = cresp.id;
counter++;
Console.WriteLine("Created Web Resource: {0}", webResource.displayName);
}
No es necesario publicar los recursos web cuando se crean. No obstante, es necesario publicarlos cuando se actualizan.