共用方式為


存取 ClickOnce 應用程式中的本機和遠端資料

大部分的應用程式都會取用或產生數據。 ClickOnce 可讓您在本機和遠端讀取和寫入資料的各種選項。

本機資料

使用 ClickOnce,您可以使用下列任一方法,在本機載入和儲存資料:

  • ClickOnce 資料目錄

  • 隔離儲存區

  • 其他本機檔案

ClickOnce 資料目錄

安裝在本機電腦上的每一個 ClickOnce 應用程式都有一個資料目錄,儲存在使用者的 [檔案和設定] 資料夾中。 ClickOnce 應用程式中包含的任何檔案,並標示為「數據」檔案,會在安裝應用程式時複製到此目錄。 數據檔可以是任何文件類型、最常使用的文字、XML 和資料庫檔案,例如 Microsoft Access .mdb 檔案。

數據目錄適用於應用程式管理的數據,也就是應用程式明確儲存和維護的數據。 應用程式指令清單中未標示為「數據」的所有靜態的非相依檔案將會改為儲存在應用程式目錄中。 此目錄是應用程式的可執行檔 (.exe) 檔案和元件所在的位置。

備註

卸載 ClickOnce 應用程式時,也會移除其資料目錄。 永遠不要使用資料目錄來儲存使用者管理的數據,例如檔。

在 ClickOnce 散發布式環境中標記資料檔案

若要將現有的檔案放在資料目錄內,您必須將現有的檔案標示為 ClickOnce 應用程式的應用程式指令清單檔案中的數據檔。 如需詳細資訊,請參閱 如何:在 ClickOnce 應用程式中加入資料檔

讀取和寫入資料目錄

從資料目錄讀取需要 ClickOnce 應用程式要求讀取許可權;同樣地,寫入目錄需要寫入許可權。 如果您的應用程式設定為使用完全信任執行,則會自動擁有此許可權。 如需使用許可權提升或受信任應用程式部署提高應用程式許可權的詳細資訊,請參閱 保護 ClickOnce 應用程式

備註

如果您的組織未使用信任的應用程式部署,並已關閉許可權提升,則許可權的設定將會失敗。

應用程式擁有這些許可權之後,就可以在 內的 System.IO類別上使用 方法呼叫來存取數據目錄。 您可以在 Windows Forms ClickOnce 應用程式中,使用DataDirectory屬性所定義於CurrentDeployment上的ApplicationDeployment屬性來取得資料目錄的路徑。 這是存取數據最方便且建議的方式。 下列程式代碼範例示範如何對在部署中包含做為資料檔案的文字檔 CSV.txt 執行此操作。

備註

ApplicationDeployment.NET Core 和 .NET 5 和更新版本中不支援命名空間中的System.Deployment.Application類別和 API。 在 .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來測試可用的下載,使用UpdateUpdateAsync下載更新,並在更新完成後進行任何自定義的數據遷移工作。

隔離儲存區 (Isolated Storage)

隔離記憶體提供 API,可讓您使用簡單的 API 來建立和存取檔案。 儲存檔案的實際位置不會顯示給開發人員和使用者看。

隔離儲存區適用於所有版本的 .NET Framework。 隔離式記憶體也適用於部分信任的應用程式,而不需要額外的許可權授與。 如果您的應用程式必須以部分信任執行,但必須維護應用程式特定數據,您應該使用隔離記憶體。

備註

在適用於 .NET Core 和 .NET 5 或更新版本的 ClickOnce 中,不支援需要程式代碼存取安全性的部分信任。 在 .NET Framework 中,使用程式代碼存取安全性不是最佳做法,不建議使用。

如需詳細資訊,請參閱 隔離儲存區

其他本機檔案

如果您的應用程式必須使用或儲存用戶數據,例如報表、影像、音樂等,您的應用程式將需要 FileIOPermission 讀取和寫入本機檔系統的數據。

遠端資料

在某些時候,您的應用程式可能必須從遠端網站擷取資訊,例如客戶數據或市場資訊。 本節討論擷取遠端數據的最常見技術。

使用 HTTP 存取檔案

您可以使用 命名空間中的 WebClientHttpWebRequest 類別,從 Web 伺服器System.Net存取資料。 數據可以是靜態檔案或 ASP.NET 傳回原始文字或 XML 數據的應用程式。 如果您的數據採用 XML 格式,擷取數據的最快方式是使用 類別,其XmlDocument方法會採用 Load URL 做為自變數。 如需範例,請參閱 將 XML 檔讀入 DOM

當您的應用程式透過 HTTP 存取遠端資料時,必須考慮安全性。 根據預設,視應用程式部署方式而定,ClickOnce 應用程式的網路資源存取可能會受到限制。 這些限制會套用,以防止惡意程式取得特殊許可權遠端數據的存取權,或使用使用者的計算機攻擊網路上的其他計算機。

下表列出您可能使用的部署策略及其預設 Web 許可權。

部署類型 默認網路許可權
Web 安裝 只能存取安裝應用程式的 Web 伺服器
檔案共享安裝 無法存取任何網頁伺服器
CD-ROM 安裝 可以存取任何網頁伺服器

如果您的 ClickOnce 應用程式因為安全性限制而無法存取網頁伺服器,應用程式必須為該網站宣告 WebPermission。 如需增加 ClickOnce 應用程式安全性許可權的詳細資訊,請參閱 保護 ClickOnce 應用程式

透過 XML Web 服務存取數據

如果您將數據公開為 XML Web 服務,您可以使用 XML Web 服務 Proxy 來存取資料。 Proxy 是您使用任一種 Visual Studio 建立的 .NET Framework 類別。 XML Web 服務的操作,例如擷取客戶、下單等等,會作為代理上的方法公開。 這可讓 Web 服務比原始文字或 XML 檔案更容易使用。

如果您的 XML Web 服務透過 HTTP 運作,服務將會受到與 WebClientHttpWebRequest 類別相同的安全性限制。

直接存取資料庫

您可以使用 命名空間內的 System.Data 類別,與網路上的 SQL Server 等資料庫伺服器建立直接連線,但您必須考慮安全性問題。 不同於 HTTP 要求,根據部分信任,預設會禁止資料庫連線要求;只有在從 CD-ROM 安裝 ClickOnce 應用程式時,您才會預設擁有這類許可權。 這會給予您的應用程式完全的信任。 若要啟用特定 SQL Server 資料庫的存取權,您的應用程式必須要求 SqlClientPermission 它;若要啟用 SQL Server 以外的數據庫存取權,它必須要求 OleDbPermission

大部分時候,您不需要直接存取資料庫,而是會透過以 ASP.NET 或 XML Web 服務撰寫的 Web 伺服器應用程式來存取資料庫。 如果您從 Web 伺服器部署 ClickOnce 應用程式,以這種方式存取資料庫通常是最佳方法。 您可以在部分信任環境中存取伺服器,而不需要提高應用程式的權限。