Доступ к локальным и удаленным данным в приложениях ClickOnce
Большинство приложений потребляют или производят данные. ClickOnce предоставляет различные варианты чтения и записи данных как локально, так и удаленно.
Локальные данные
С помощью ClickOnce можно загружать и хранить данные локально с помощью любого из следующих методов:
Каталог данных ClickOnce
Изолированное хранилище
Другие локальные файлы
Каталог данных ClickOnce
Каждое приложение ClickOnce, установленное на локальном компьютере, содержит каталог данных, хранящийся в папке "Документы пользователя" и Параметры. Любой файл, включенный в приложение ClickOnce и помеченный как файл data, копируется в этот каталог при установке приложения. Файлы данных могут представлять собой данные любого типа. Чаще всего используются текстовые файлы, файлы XML и файлы базы данных, например MDB-файлы Microsoft Access.
Каталог данных предназначен для управляемых приложением данных, то есть данных, которые приложение явно сохраняет и обслуживает. Все статические, независимые файлы, которые не помечены как «данные» в манифесте приложения, помещаются в каталог приложения. В этом же каталоге находятся исполняемые файлы приложения (.exe) и сборки.
Примечание.
При удалении приложения ClickOnce его каталог данных также удаляется. Никогда не используйте каталог данных для хранения управляемых конечным пользователем данных, например документов.
Пометка файлов данных в дистрибутиве ClickOnce
Чтобы поместить существующий файл в каталог данных, необходимо пометить существующий файл как файл данных в файле манифеста приложения ClickOnce. Дополнительные сведения см. в разделе Практическое руководство. Включение файла данных в приложение ClickOnce.
Чтение и запись в каталог данных
Для чтения из каталога данных требуется разрешение на чтение приложения ClickOnce; Аналогичным образом, для записи в каталог требуется разрешение на запись. Ваше приложение получит это разрешение автоматически, если оно настроено для работы с полным доверием. Дополнительные сведения о повышении разрешений для приложения с помощью повышения прав разрешений или доверенного развертывания приложений см. в разделе "Безопасные приложения ClickOnce".
Примечание.
Если в организации не используется развертывание надежных приложений и отключено повышение уровня разрешений, подтверждение разрешений завершится ошибкой.
Получив эти разрешения, ваше приложение сможет осуществлять доступ в каталог данных, используя вызовы метода в классах типа System.IO. Путь к каталогу данных можно получить в приложении ClickOnce Windows Forms с помощью DataDirectory свойства, определенного CurrentDeployment ApplicationDeploymentдля свойства. Это самый удобный и рекомендуемый способ доступа к данным. В следующем примере кода показано, как сделать это для текстового файла CSV.txt, включенного вами в развертывание в качестве файла данных.
Примечание.
Класс ApplicationDeployment и API в System.Deployment.Application пространстве имен не поддерживаются в .NET Core и .NET 5 и более поздних версиях. В .NET 7 поддерживается новый метод доступа к свойствам развертывания приложения. Дополнительные сведения см. в разделе "Свойства развертывания Access ClickOnce" в .NET. .NET 7 не поддерживает эквивалент методов 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);
}
}
Дополнительные сведения о маркировке файлов в развертывании как файлов данных см. в разделе How to: Include a Data File in a ClickOnce Application.
Можно также получить путь к каталогу данных, используя соответствующие переменные в классе Application , например LocalUserAppDataPath.
Для выполнения операций с другими типами файлов могут потребоваться дополнительные разрешения. Например, если вы хотите использовать файл базы данных Access (.mdb), приложение должно подтвердить полное доверие, чтобы использовать соответствующие <классы xref:System.Data> .
Каталог данных и версии приложения
Каждая версия приложения имеет свой собственный каталог данных, который изолирован от других версий. ClickOnce создает этот каталог независимо от того, включены ли файлы данных в развертывание, чтобы приложение было расположено для создания новых файлов данных во время выполнения. При установке новой версии приложения ClickOnce копирует все существующие файлы данных из каталога данных предыдущей версии в каталог данных новой версии, независимо от того, были ли они включены в исходное развертывание или созданы приложением.
ClickOnce заменит старую версию файла более новой версией сервера, если файл данных имеет другое хэш-значение в старой версии приложения, как и в новой версии. Кроме того, если более ранняя версия приложения создала новый файл с тем же именем, что и файл, включенный в развертывание новой версии, ClickOnce перезапишет файл старой версии новым файлом. В обоих случаях старые файлы будут включены в подкаталог внутри каталога данных с именем .pre
, так что приложение по-прежнему будет иметь доступ к старым данным в целях миграции.
Если требуется более детальное перемещение данных, можно использовать API развертывания ClickOnce для выполнения пользовательской миграции из старого каталога данных в новый каталог данных. Необходимо будет проверить наличие доступной загрузки, воспользовавшись свойством IsFirstRun, загрузить обновление с использованием Update или UpdateAsync, а затем самостоятельно выполнить действия по пользовательской миграции данных по окончании обновления.
Изолированное хранилище
Изолированное хранилище предоставляет API для создания файлов с использованием простого API и осуществления доступа к ним. Фактическое расположение хранимых файлов скрыто от разработчика и пользователя.
Изолированные служба хранилища работают во всех версиях платформа .NET Framework. Изолированное хранилище также работает в приложениях с частичным доверием, предоставлять дополнительные разрешения не требуется. Изолированное хранилище следует использовать, если приложение должно выполняться с частичным доверием, но при этом обслуживать данные приложения.
Для получения дополнительной информации см. Изолированное хранилище.
Другие локальные файлы
Если приложение должно работать с данными конечных пользователей или сохранять такие данные (отчеты, изображения, музыку и т. д.), приложению потребуется разрешение FileIOPermission для чтения и записи данных в локальной файловой системе.
Удаленные данные
На некотором этапе приложению, скорее всего, необходимо будет извлечь сведения с удаленного веб-сайта, например клиентские данные или информацию о рынке. В этом разделе рассматриваются наиболее распространенные методы получения удаленных данных.
Доступ к файлам с помощью HTTP
Доступ к данным на веб-сервере можно осуществлять с использованием класса WebClient или HttpWebRequest в пространстве имен System.Net . Эти данные могут быть статическими файлами или ASP.NET приложениями, возвращающими необработанный текст или XML-данные. Если формат данных отличается от XML, самым быстрым способом извлечения данных будет использование класса XmlDocument , метод Load которого принимает URL-адрес в качестве аргумента. Пример см. в разделе "Чтение XML-документа" в DOM.
Необходимо помнить о соображениях безопасности, когда приложение осуществляет доступ к удаленным данным через HTTP. По умолчанию доступ приложения ClickOnce к сетевым ресурсам может быть ограничен в зависимости от способа развертывания приложения. Эти ограничения применяются, чтобы не допустить доступа вредоносных программ к привилегированным удаленным данным или использования компьютера пользователя для атаки на другие компьютеры в сети.
В следующей таблице перечислены стратегии развертывания, которые можно использовать, и их разрешения в Интернете по умолчанию.
Тип развертывания | Сетевые разрешения по умолчанию |
---|---|
Веб-установка | Имеется доступ только к веб-серверу, с которого было установлено приложение |
Установка общей папки | Отсутствует доступ к веб-серверам |
Установка с компакт-диска | Доступны любые веб-серверы |
Если приложение ClickOnce не может получить доступ к веб-серверу из-за ограничений безопасности, приложение должно утверждать WebPermission для этого веб-сайта. Дополнительные сведения о повышении разрешений безопасности для приложения ClickOnce см. в разделе "Безопасные приложения ClickOnce".
Доступ к данным через веб-службу XML
Если предоставить данные в качестве веб-службы XML, можно осуществлять доступ к этим данным с помощью прокси-сервера веб-службы XML. Прокси-сервер — это класс платформа .NET Framework, создаваемый с помощью Visual Studio. Операции веб-службы XML, такие как извлечение клиентов, размещение заказов и т. д., предоставляются как методы прокси-сервера. Благодаря этому пользоваться веб-службами гораздо проще, чем обычным текстом или файлами XML.
Если ваш веб-служба XML работает по протоколу HTTP, в отношении нее будут действовать те же ограничения безопасности, как и в отношении классов WebClient и HttpWebRequest .
Доступ к базе данных напрямую
Можно использовать классы в пространстве имен System.Data для установки прямого подключения к серверу базы данных, например SQL Server в сети, однако при этом необходимо учитывать соображения безопасности. В отличие от HTTP-запросов, запросы на подключение к базе данных всегда запрещаются по умолчанию при частичном доверии; По умолчанию у вас будет только такое разрешение, если вы устанавливаете приложение ClickOnce из компакт-диска. Это обеспечивает приложению полный уровень доверия. Чтобы включить доступ к конкретной базе данных SQL Server, приложение должно запросить для него разрешение SqlClientPermission ; чтобы включить доступ к базе данных, отличной от БД SQL Server, необходимо запросить разрешение OleDbPermission.
Большую часть времени вам не придется обращаться к базе данных напрямую, но будет обращаться к ней через веб-серверное приложение, написанное в ASP.NET или веб-службе XML. Доступ к базе данных таким образом часто является лучшим способом, если приложение ClickOnce развертывается с веб-сервера. Доступ к серверу с частичным доверием можно осуществлять без повышения уровня разрешений вашего приложения.