Acceso a datos locales y remotos en aplicaciones ClickOnce

La mayoría de las aplicaciones consumen o producen los datos. ClickOnce ofrece diversas opciones para leer y escribir datos, tanto local como remotamente.

Datos locales

Con ClickOnce, puede cargar y almacenar datos localmente usando cualquiera de los métodos siguientes:

  • Directorio de datos de ClickOnce

  • Almacenamiento aislado

  • Otros archivos locales

Directorio de datos de ClickOnce

Cada aplicación ClickOnce instalada en un equipo local dispone de un directorio de datos almacenado en la carpeta Documents and Settings del usuario. Todos los archivos incluidos en una aplicación ClickOnce y marcados como archivos de «datos» se copian en este directorio cuando se instala una aplicación. Los archivos de datos pueden ser de cualquier tipo de archivo; los que se usan con más frecuencia son los archivos de texto, XML y de base de datos, como los archivos .mdb de Microsoft Access.

El directorio de datos está pensado para los datos administrados de la aplicación, que son datos que la aplicación almacena y mantiene explícitamente. En cambio, todos los archivos estáticos y que no son de dependencia que no estén marcados como «datos» en el manifiesto de aplicación residirán en el directorio de la aplicación. Este directorio es donde residen los archivos ejecutables (.exe) y los ensamblados de la aplicación.

Nota

Cuando se desinstala una aplicación ClickOnce, también se quita su directorio de datos. No use nunca el directorio de datos para almacenar datos administrados del usuario final, como documentos.

Marcado de archivos de datos en una distribución de ClickOnce

Para incluir un archivo existente en el directorio de datos, debe marcar dicho archivo como un archivo de datos en el archivo de manifiesto de aplicación de la aplicación ClickOnce. Para obtener más información, consulte Cómo: Incluir un archivo de datos en una aplicación ClickOnce.

Lectura y escritura en el directorio de datos

Para leer desde el directorio de datos es necesario que la aplicación ClickOnce solicite permiso de lectura; de forma similar, la escritura en el directorio requiere permiso de escritura. La aplicación tendrá este permiso automáticamente si se configura para que se ejecute con plena confianza. Para obtener más información sobre cómo elevar los permisos de la aplicación usando la elevación de permisos o la implementación de aplicaciones de confianza, consulte Seguridad e implementación de ClickOnce.

Nota

Si su organización no usa la implementación de aplicaciones de confianza y ha desactivado la elevación de permisos, los permisos de aserción generarán un error.

Una vez que la aplicación tenga estos permisos, puede acceder al directorio de datos usando llamadas a métodos en clases dentro de System.IO. Puede obtener la ruta de acceso del directorio de datos dentro de una aplicación ClickOnce de Windows Forms mediante la propiedad DataDirectory definida en la propiedad CurrentDeployment de ApplicationDeployment. Esta es la manera más conveniente y recomendada de acceder a los datos. En el ejemplo de código siguiente se muestra cómo hacer esto en un archivo de texto denominado CSV.txt que ha incluido en la implementación como un archivo de datos.

Nota:

La clase ApplicationDeployment y las API del espacio de nombres System.Deployment.Application no se admiten en .NET Core y .NET 5 y versiones posteriores. En .NET 7 se admite un nuevo método de acceso a las propiedades de implementación de aplicaciones. Para obtener más información, consulte Acceso a las propiedades de implementación de ClickOnce en .NET. .NET 7 no admite el equivalente de los métodos ApplicationDeployment.

if (ApplicationDeployment.IsNetworkDeployed)
{
    try
    {
        using (StreamReader sr = new StreamReader(ApplicationDeployment.CurrentDeployment.DataDirectory + @"\CSV.txt"))
        {
            MessageBox.Show(sr.ReadToEnd());
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Could not read file. Error message: " + ex.Message);
    }
}

Para obtener más información sobre cómo marcar archivos de la implementación como archivos de datos, consulte How to: Include a Data File in a ClickOnce Application.

También puede obtener la ruta de acceso del directorio de datos usando las variables correspondientes de la clase Application , como LocalUserAppDataPath.

La manipulación de otros tipos de archivos puede requerir permisos adicionales. Por ejemplo, si desea usar una base de datos de Access (archivo .mdb), la aplicación debe imponer plena confianza para poder usar las clases <xref:System.Data> correspondientes.

Directorio de datos y versiones de la aplicación

Cada versión de una aplicación tiene su propio directorio de datos, que está aislado de otras versiones. ClickOnce crea este directorio independientemente de si se incluyen archivos de datos en la implementación, de modo que la aplicación tenga una ubicación donde crear nuevos archivos de datos en tiempo de ejecución. Cuando se instala una versión nueva de una aplicación, ClickOnce copiará todos los archivos de datos existentes del directorio de datos de la versión anterior en el directorio de datos de la versión nueva, tanto si estaban incluidos en la implementación original como si los creó por la aplicación.

ClickOnce reemplazará la versión anterior del archivo con la versión más reciente del servidor si un archivo de datos tiene un valor de hash diferente en la versión anterior de la aplicación y en la versión nueva. Además, si la versión anterior de la aplicación creó un archivo nuevo con el mismo nombre que un archivo incluido en la implementación de la versión nueva, ClickOnce sobrescribirá el archivo de la versión anterior con el archivo nuevo. En ambos casos, los archivos anteriores se incluirán en un subdirectorio del directorio de datos denominado .pre, de modo que la aplicación todavía podrá acceder a los datos antiguos para fines de migración.

Si necesita una migración de datos más precisa, puede usar la API de implementación de ClickOnce para realizar la migración personalizada desde el directorio de datos anterior al directorio de datos nuevo. Tendrá que probar una descarga disponible mediante IsFirstRun, descargar la actualización mediante Update o UpdateAsyncy hacer que la migración de datos personalizada funcione en su aplicación una vez finalizada la actualización.

Almacenamiento aislado

El almacenamiento aislado proporciona una API para crear y acceder a archivos mediante una API sencilla. La ubicación real de los archivos almacenados está oculta para el desarrollador y el usuario.

El almacenamiento aislado funciona en todas las versiones de ClickOnce. El almacenamiento aislado también funciona en aplicaciones de confianza parcial sin necesidad de que se concedan permisos adicionales. Debe usar el almacenamiento aislado si la aplicación debe ejecutarse en confianza parcial, pero debe conservar los datos específicos de la aplicación.

Para obtener más información, consulta Almacenamiento aislado.

Otros archivos locales

Si la aplicación debe funcionar con datos del usuario final o si debe guardar dichos datos, como informes, imágenes, música, etc., la aplicación necesitará FileIOPermission para leer y escribir datos en el sistema de archivos local.

Datos remotos

En algún momento, la aplicación probablemente tendrá que recuperar información de un sitio web remoto, como datos de clientes o información de mercado. En esta sección se describen las técnicas más comunes para recuperar datos remotos.

Acceso a archivos con HTTP

Puede acceder a datos desde un servidor web usando la clase WebClient o HttpWebRequest en el espacio de nombres System.Net . Los datos pueden ser archivos estáticos o aplicaciones de ASP.NET que devuelven texto sin formato o datos XML. Si los datos están en formato XML, la forma más rápida de recuperar los datos consiste en usar la clase XmlDocument , cuyo método Load toma una dirección URL como argumento. Para obtener un ejemplo, consulte Lectura de un documento XML en el DOM.

Debe tener en cuenta la seguridad cuando la aplicación acceda a datos remotos a través de HTTP. De forma predeterminada, el acceso de la aplicación ClickOnce a los recursos de red puede estar restringido, en función de cómo se implementase la aplicación. Estas restricciones se aplican para impedir que programas malintencionados obtengan acceso a datos remotos privilegiados o usen el equipo de un usuario para atacar a otros equipos de la red.

En la tabla siguiente se enumeran las estrategias de implementación que podría usar y sus permisos web predeterminados.

Tipo de implementación Permisos de red predeterminados
Instalación web Solo puede acceder al servidor web desde el que se instaló la aplicación
Instalación de recurso compartido de archivos No puede acceder a servidores web
Instalación de CD-ROM Puede acceder a servidores web

Si su aplicación ClickOnce no puede acceder a un servidor web debido a restricciones de seguridad, la aplicación debe imponer WebPermission para ese sitio web. Para obtener más información sobre cómo aumentar los permisos de seguridad para una aplicación , consulte Seguridad e implementación de ClickOnce.

Acceso a datos a través de un servicio Web XML

Si expone los datos como un servicio web XML, puede acceder a los datos mediante el uso de un proxy de servicio web XML. El proxy es una clase de .NET Framework que se crea mediante Visual Studio. Las operaciones del servicio web XML (como recuperar clientes, realizar pedidos, etc.) se exponen como métodos en el proxy. Esto hace que los servicios web sean mucho más fáciles de usar que los archivos XML o de texto sin formato.

Si el servicio web XML funciona a través de HTTP, el servicio estará sujeto a las mismas restricciones de seguridad que las clases WebClient y HttpWebRequest .

Acceso directo a una base de datos

Puede usar las clases en el espacio de nombres System.Data para establecer conexiones directas con un servidor de base de datos como SQL Server en la red, pero debe tener en cuenta las cuestiones de seguridad. A diferencia de las solicitudes HTTP, las solicitudes de conexión de base de datos siempre están prohibidas de manera predeterminada en la confianza parcial; solo obtendrá dichos permisos de forma predeterminada si instala la aplicación ClickOnce desde un CD-ROM. Esto le concede a la aplicación plena confianza. Para habilitar el acceso a una base de datos de SQL Server específica, la aplicación debe solicitarle SqlClientPermission ; para habilitar el acceso a una base de datos que no sea SQL Server, debe solicitar OleDbPermission.

La mayoría de las veces, no tendrá que acceder a la base de datos directamente, sino que lo hará a través de una aplicación de servidor web escrita en ASP.NET o un servicio web XML. Esta forma de acceder a la base de datos suele ser el mejor método si la aplicación ClickOnce se implementó desde un servidor web. Puede acceder al servidor de confianza parcial sin tener que elevar los permisos de la aplicación.