ClickOnce 애플리케이션의 로컬 및 원격 데이터 액세스

대부분 애플리케이션에서는 데이터를 사용하거나 생성합니다. ClickOnce에서는 로컬에서 또는 원격으로 데이터를 읽고 쓰는 다양한 옵션을 제공합니다.

로컬 데이터

ClickOnce에서는 다음 메서드 중 하나를 사용하여 데이터를 로컬에서 로드하고 저장할 수 있습니다.

  • ClickOnce 데이터 디렉터리

  • 격리된 스토리지

  • 기타 로컬 파일

ClickOnce 데이터 디렉터리

로컬 컴퓨터에 설치된 모든 ClickOnce 애플리케이션에는 사용자의 Documents and Settings 폴더에 저장된 데이터 디렉터리가 있습니다. ClickOnce 애플리케이션에 포함되고 “데이터” 파일로 표시된 모든 파일은 애플리케이션이 설치될 때 이 디렉터리에 복사됩니다. 데이터 파일의 파일 형식은 가장 자주 사용되는 텍스트, XML 및 데이터베이스 파일(예: Microsoft Access .mdb 파일)이 될 수 있습니다.

데이터 디렉터리는 애플리케이션이 명시적으로 저장 및 유지 관리하는 데이터인 애플리케이션에서 관리되는 데이터에 사용됩니다. 애플리케이션 매니페스트에서 “데이터"로 표시되지 않은 모든 정적, 독립적 파일은 애플리케이션 디렉터리에 있습니다. 이 디렉터리에는 애플리케이션의 실행( .exe) 파일 및 어셈블리가 있습니다.

참고

ClickOnce 애플리케이션이 제거되면 데이터 디렉터리도 제거됩니다. 문서와 같이 최종 사용자가 관리하는 데이터를 저장하는 데 절대 데이터 디렉터리를 사용하지 마세요.

ClickOnce 배포에서 데이터 파일 표시

데이터 디렉터리에 기존 파일을 넣으려면 ClickOnce 애플리케이션의 애플리케이션 매니페스트 파일에서 기존 파일을 데이터 파일로 표시해야 합니다. 자세한 내용은 방법: ClickOnce 애플리케이션에 데이터 파일 포함을 참조하세요.

데이터 디렉터리에서 읽고 쓰기

데이터 디렉터리에서 데이터를 읽으려면 ClickOnce 애플리케이션이 읽기 권한을 요청해야 합니다. 마찬가지로 디렉터리에 쓰려면 쓰기 권한이 필요합니다. 애플리케이션이 완전 신뢰로 실행되도록 구성되면 이 권한이 애플리케이션에 자동으로 포함됩니다. 권한 상승 또는 신뢰할 수 있는 애플리케이션 배포를 사용하여 애플리케이션에 대한 권한을 높이는 방법에 대한 자세한 내용은 ClickOnce 애플리케이션 보안을 참조하세요.

참고

조직에서 신뢰할 수 있는 애플리케이션 배포를 사용하지 않고 권한 상승을 해제했으면 권한 어설션이 실패합니다.

애플리케이션에 이들 권한이 포함되고 나면 애플리케이션이 System.IO내의 클래스에서 메서드 호출을 사용하여 데이터 디렉터리에 액세스할 수 있습니다. ApplicationDeploymentCurrentDeployment 속성에 정의된 DataDirectory 속성을 사용하여 Windows Forms ClickOnce 애플리케이션 내에서 데이터 디렉터리의 경로를 가져올 수 있습니다. 이 방법은 데이터에 액세스하는 가장 편리하고 권장되는 방법입니다. 다음 코드 예제에서는 배포에 데이터 파일로 포함한 CSV.txt 텍스트 파일에 대해 이 작업을 수행하는 방법을 보여 줍니다.

참고

System.Deployment.Application 네임스페이스의 ApplicationDeployment 클래스 및 API는 .NET Core 및 .NET 5 이상 버전에서 지원되지 않습니다. .NET 7에서 애플리케이션 배포 속성에 액세스하는 새로운 방법을 지원합니다. 자세한 내용은 .NET에서 ClickOnce 배포 속성 액세스를 참조하세요. .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하위 디렉터리에 포함되므로 애플리케이션이 마이그레이션을 위해 계속 이전 데이터에 액세스할 수 있습니다.

세부적인 데이터 마이그레이션이 필요하면 ClickOnce 배포 API를 사용하여 이전 데이터 디렉터리에서 새 데이터 디렉터리로 사용자 지정 마이그레이션을 수행할 수 있습니다. IsFirstRun을 사용하여 사용 가능한 다운로드가 있는지 테스트하거나, Update 또는 UpdateAsync를 사용하여 업데이트를 다운로드하고 업데이트가 완료된 후 사용자 지정 데이터 마이그레이션 작업을 수행해야 합니다.

격리된 스토리지

격리된 스토리지는 단순 API를 사용하여 파일을 만들고 파일에 액세스하기 위한 API를 제공합니다. 저장된 파일의 실제 위치는 개발자 및 사용자에게 표시되지 않습니다.

격리된 스토리지는 모든 버전의 .NET Framework에서 작동합니다. 격리된 스토리지는 추가적인 권한을 부여할 필요 없이 부분적으로 신뢰할 수 있는 애플리케이션에서도 작동합니다. 애플리케이션이 부분 신뢰로 실행되어야 하지만 애플리케이션 특정 데이터를 유지 관리해야 하면 격리된 스토리지를 사용해야 합니다.

자세한 내용은 격리된 스토리지를 참조하세요.

기타 로컬 파일

애플리케이션이 보고서, 이미지, 음악 등의 최종 사용자 데이터를 사용하거나 저장해야 하면 애플리케이션에는 로컬 파일 시스템에서 데이터를 읽고 쓸 수 있는 FileIOPermission 이 필요합니다.

원격 데이터

나중에 애플리케이션이 원격 웹 사이트에서 고객 데이터나 시장 정보와 같은 정보를 검색해야 할 수 있습니다. 이 섹션에서는 원격 데이터를 검색하는 가장 일반적인 방법을 설명합니다.

HTTP를 통해 파일 액세스

WebClient 네임스페이스의 HttpWebRequest 또는 System.Net 클래스를 사용하여 웹 서버에서 데이터에 액세스할 수 있습니다. 데이터는 정적 파일이거나 원시 텍스트 또는 XML 데이터를 반환하는 ASP.NET 애플리케이션일 수 있습니다. 데이터가 XML 형식이면 포함된 XmlDocument 메서드가 URL을 인수로 사용하는 Load 클래스를 사용하여 데이터를 가장 빠르게 검색할 수 있습니다. 예제를 보려면 DOM에 XML 문서 읽어오기를 참조하세요.

애플리케이션이 HTTP를 통해 원격 데이터에 액세스할 경우 보안을 고려해야 합니다. 기본적으로 애플리케이션 배포 방법에 따라 ClickOnce 애플리케이션의 네트워크 리소스 액세스가 제한될 수 있습니다. 악의적인 프로그램이 권한 있는 원격 데이터에 액세스하지 못하도록 차단하거나 사용자 컴퓨터를 사용하여 네트워크의 다른 컴퓨터를 공격하지 못하도록 차단하기 위해 이러한 제한이 적용됩니다.

다음 표에는 사용할 수 있는 배포 전략 및 기본 웹 권한이 나와 있습니다.

배포 유형 기본 네트워크 권한
웹 설치 애플리케이션이 설치되는 소스 웹 서버에만 액세스할 수 있습니다.
파일 공유 설치 웹 서버에 액세스할 수 없습니다.
CD-ROM 설치 웹 서버에 액세스할 수 있습니다.

보안 제한으로 인해 ClickOnce 애플리케이션이 웹 서버에 액세스할 수 없으면 애플리케이션은 해당 웹 사이트에 대한 WebPermission을 어설션해야 합니다. ClickOnce 애플리케이션의 보안 권한을 높이는 방법에 대한 자세한 내용은 ClickOnce 애플리케이션 보안을 참조하세요.

XML Web services를 통해 데이터에 액세스

데이터를 XML Web service로 노출하면 XML Web service 프록시를 통해 데이터에 액세스할 수 있습니다. 프록시는 Visual Studio를 사용하여 만드는 .NET Framework 클래스입니다. 고객 검색, 주문 제출 등의 XML Web service 작업은 프록시에서 메서드로 노출됩니다. 이를 통해 원시 텍스트 또는 XML 파일보다 훨씬 더 쉽게 Web services를 사용할 수 있습니다.

XML Web service가 HTTP를 통해 작동할 경우 서비스는 WebClientHttpWebRequest 클래스와 같은 보안 제한 사항이 적용됩니다.

데이터베이스에 직접 액세스

System.Data 네임스페이스 내의 클래스를 사용하여 네트워크의 SQL Server와 같은 데이터베이스 서버에 대한 직접 연결을 설정할 수 있지만 보안 문제를 고려해야 합니다. HTTP 요청과 달리 데이터베이스 연결 요청은 기본적으로 부분 신뢰에서 항상 금지됩니다. CD-ROM에서 ClickOnce 애플리케이션을 설치하는 경우에만 기본적으로 이러한 권한을 갖게 됩니다. 이렇게 하면 애플리케이션에 완전 신뢰가 제공됩니다. 특정 SQL Server 데이터베이스에 대한 액세스를 사용하려면 애플리케이션이 SqlClientPermission 을 요청해야 하고, SQL Server 이외의 데이터베이스에 대한 액세스를 사용하려면 OleDbPermission을 요청해야 합니다.

대체로 데이터베이스에 직접 액세스할 필요가 없고 ASP.NET에서 작성된 웹 서버 애플리케이션 또는 XML Web services를 통해 액세스합니다. ClickOnce 애플리케이션이 웹 서버에서 배포될 경우 이 방식으로 데이터베이스에 액세스하는 것이 가장 적합한 방법인 경우가 많습니다. 애플리케이션의 권한을 높이지 않고 서버를 부분 신뢰로 액세스할 수 있습니다.