本文章是由機器翻譯。

深究 CLR

隔離儲存區,在 Silverlight 2

Justin Van Patten

內容

隔離
配額
檔案和目錄
IsolatedStorageSettings

在 8 月) 2008MSDN Magazine資料行深究 CLR,Andrew Pardoe Silverlight 2 中提供隔離儲存區的簡短概觀 (」程式與 [CoreCLR Silverlight").此的資料行中我將在您自己的應用程式中使用它在 Silverlight 中一起一些最佳作法隔離的存放區提供更多詳細資料。

隔離儲存區至投擲之前, 請讓我先說明哪些 I / O 功能是 Silverlight 中方法。Silverlight 應用程式是在內部 Web 瀏覽器在沙箱式環境中執行的部分信任應用程式。因此,不允許任何存取檔案系統。和很好的理由,您不希望您瀏覽網頁存取您的個人檔案或混亂與您的系統時遇到的隨機的潛在的惡意 Silverlight 應用程式。

但有有效案例,它可以讓 Silverlight 應用程式在某些數量限制存取檔案系統,是否讀取檔案 (具有使用者的同意),或將資料儲存在用戶端上的本機的。Silverlight 2 中以限制和安全的方式支援這兩種案例: 先前已啟用使用 OpenFileDialog 和後者有了隔離儲存區。

像 Cookie,隔離儲存區可以儲存在用戶端應用程式引動過程之間的資料。但不同 Cookie,隔離儲存區會是完整的虛擬檔案系統,提供應用程式,能夠建立、讀取、 寫入、 刪除,以及列舉檔案和目錄在虛擬檔案系統。隔離儲存區可以用於 Cookie,一樣維護狀態和簡單的應用程式設定,但它也可用來將大量的資料儲存在用戶端上的本機。

隔離儲存區沒有新的 Silverlight ; 它已自 v1.0.NET Framework 的一部分。現在 Silverlight 隨附的.NET Framework 的隔離儲存區 API,簡化子集,但是它也會包含新的 API,以提供額外的功能,連同一些新的概念。

隔離

如您可能會預期其中一個金鑰的 Facet,隔離儲存區的會是隔離。隔離儲存區是由許多不同的存放唯一區,每一個都可以視為自己的虛擬檔案系統所組成。路徑無法逸出的虛擬檔案系統可以有效地隔離儲存區的其他部分檔案系統的界限。這可防止在惡意應用程式能夠存取任意檔案和磁碟上的目錄 (例如:\..\..\..\Windows\System32—where 它可能會導致損毀或存取敏感性資訊。

Silverlight 應用程式可以存取兩個不同的儲存區: 使用者 + 應用程式存放區 (或應用程式存放區),是隔離使用者識別和應用程式識別和使用者 + 站台的儲存區(或站台的儲存區),由使用者識別 (Identity) 和站台識別中隔離。隔離儲存區,根據使用者、 應用程式和網站的識別,則表示應用程式只可以存取儲存區的允許存取,它無法存取儲存區的其他應用程式。

使用者識別 Silverlight 所採用的會是基礎的 T: System.Web.UI.MobileControls.Adapters.XhtmlAdapters.系統相同使用者識別。Silverlight 會藉由在目前使用者的本機應用程式資料目錄中儲存所有的隔離儲存區資料,每個使用者隔離。[圖 1 ] 具有需隔離儲存區的位置,為每個作業系統的詳細資訊。

圖 1 的位置,隔離儲存區的檔案系統中的
作業系統 在檔案系統中的位置
Windows Vista <systemdrive> \Users\ <user> \AppData\LocalLow\Microsoft\Silverlight\is
Windows XP <systemdrive> \ Documents and <user> Settings \ \Local Settings\Application Data\Microsoft\Silverlight\is
Mac OS X /Users/ <user> / 程式庫 / 應用程式支援 / Microsoft / Silverlight / 是

在應用程式儲存區是一個唯一的儲存區,每個應用程式。Silverlight 應用程式只能存取其應用程式存放區,; 它無法存取任何其他應用程式的應用程式存放區]。應用程式存放區根據使用者的識別和應用程式的識別。Silverlight 應用程式的身分識別會不 Silverlight 應用程式的 XAP 檔,完整的 URL。例如,http://Microsoft.com/App.xap 會是裝載在 http://Microsoft.com/App.xap Silverlight 應用程式的應用程式識別。應用程式識別碼不區分大小寫,因此 http://MICROSOFT.COM/App.XAPhttp://Microsoft.com/App.xap 相同的識別。Silverlight 的新應用程式存放區,不是 ; 已存在在.NET Framework v2.0 之後。下列程式碼會顯示如何在應用程式的應用程式存放區中建立一個檔案:

try {
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    using (var stream = store.CreateFile("hello.txt"))
    using (var writer = new StreamWriter(stream)) {
        writer.Write("Hello World");
    }
}
catch (IsolatedStorageException) {
    // Isolated storage not enabled or an error occurred
}

Silverlight 的隔離儲存區的最佳作法

當您使用隔離儲存區 (Isolated Storage 時,請遵循這些方針,將會幫助您避免發生問題,並讓最會保護隔離存放區的提供。

  • 換行的所有呼叫隔離在 try / catch 區塊內的儲存區彈性潛在 IsolatedStorageExceptions 的可以擲回如果隔離儲存區已停用,或如果已刪除儲存區。
  • 如果您的 Silverlight 應用程式需要隔離儲存區儲存大量資料,則會考慮裝載它自己的網站上,以便它不會影響其他網站上的應用程式和其他應用程式並不會影響它。
  • 如果您需要共用資料,在用戶端上的 Silverlight 應用程式的一組相同的網站上裝載它們。
  • 隔離儲存區的路徑,盡可能讓小到達 260 字元的限制時,防止內部的完整路徑。
  • 加密儲存在隔離儲存區的機密資料。
  • 您可以使用 IsolatedStorageSettings 來儲存物件和簡單的設定,在隔離儲存區中。
  • 如果您要使用檔案和資料流為基礎的 API 使用 IsolatedStorageFile 儲存大量的資料,或需要精密控制隔離儲存區的內容。

此處所使用的 API,隔離儲存區位於 System.IO.IsolatedStorage 命名空間中。您可以取得呼叫 IsolatedStorageFile.GetUserStoreForApplication 的應用程式存放區的執行個體。如果啟用隔離儲存區 (它是預設安裝 Silverlight 時),會傳回可用來處理存放區的 IsolatedStorageFile 執行個體。如果使用者已停用隔離儲存區 (Isolated Storage,IsolatedStorageException 擲回。

使用者可以啟用 / 停用隔離儲存區中,所以一定要永遠包裝 try / catch 區塊內呼叫 IsolatedStorageFile.GetUserStoreForApplication。事實上,IsolatedStorageException 可能會擲回從隔離儲存區的任何作業。如果使用者刪除隔離儲存區,應用程式會使用它 (下一個作業將會導致 IsolatedStorageException) 時,便可能發生這種情況。加上,如果應用程式的多個執行個體 (在多個瀏覽器視窗或例如索引標籤) 的執行和其中一個 「 的存放區,然後在下一次的隔離儲存區作業執行的其中一個其他應用程式執行個體在執行個體刪除將會擲回 IsolatedStorageException。

最佳作法是,包裝所有呼叫以防範發生 IsolatedStorageExceptions try / catch 區塊內的隔離儲存。我已包裝此第一個程式碼範例,說明此,但把事情簡單化在 try / catch 區塊內,其餘的程式碼範例將不會顯示在 try / catch 區塊。請考慮為被隱含地包裝在 try / catch 區塊中所有其餘程式碼範例。(在摘要的最佳作法中,請參閱資訊看板 「 Silverlight 隔離儲存區最佳作法 」)。

既然您已經知道儲存的應用程式,讓我們看看網站儲存區。在的網站儲存區是一個共用的儲存區相同站台的應用程式可存取的所有的 Silverlight。這可讓來自相同網站的應用程式共用它們之間的資料。

相同的方式,Microsoft Office 2007 跨應用程式的套件中有通用的喜好設定,您無法假設開發一套所有裝載在相同網站上和共用通用組喜好設定儲存在用戶端上的 Silverlight 應用程式。網站儲存區根據使用者的識別和網站的識別。在的 Silverlight 應用程式的網站識別應用程式識別碼,類似,但它只包括配置、 主機及連接埠的 URL 不 XAP) 檔案路徑。像應用程式識別碼,網站識別也是不區分大小寫。共用的網站儲存區是 Silverlight 中新增的而且在.NET Framework 中沒有。

IsolatedStorageFile.GetUserStoreForSite 可以用來取得網站儲存區的執行個體。下列程式碼動作中顯示這個:

using (var store = IsolatedStorageFile.GetUserStoreForSite())
using (var stream = store.CreateFile("sharedhello.txt"))
using (var writer = new StreamWriter(stream)) {
    writer.Write ("Hello Shared World");
}

另一個具有相同的站台識別碼的應用程式無法讀取共用的檔案,以下列程式碼:

using (var store = IsolatedStorageFile.GetUserStoreForSite()) {
    if (store.FileExists("sharedhello.txt")) {
        using (var stream = store.OpenFile("sharedhello.txt", FileMode.Open))
        using (var reader = new StreamReader(stream)) {
            string contents = reader.ReadToEnd(); // "Hello Shared World"
        }
    }
}

若要瞭解如何指定的 URL 到 Silverlight 應用程式對應於的應用程式識別碼 」 和 「 站台識別,請參閱 [圖 2] 。如您所見,即使是不同的前四個 URL,它們會對應至在相同的應用程式識別碼 」 和 「 站台識別。這是因為到識別是不區分大小寫、 查詢字串包含,並不是連接埠 80 是 HTTP 配置在預設通訊埠。不過,如果另一個連接埠指定為,例如 8080,然後,應用程式的識別會被視為不同。如果省略,則前的置字元"www 從主應用程式,應用程式識別碼會被視為不同因為主應用程式不同。

[圖 2 Silverlight 應用程式的 URL 和關聯的應用程式與網站識別
應用程式的 URL 應用程式識別碼 站台識別
http://www.microsoft.com/App.xap HTTP://WWW.MICROSOFT.COM/APP.XAP HTTP://WWW.MICROSOFT.COM
http://www.MICROSOFT.COM/App.XAP HTTP://WWW.MICROSOFT.COM/APP.XAP HTTP://WWW.MICROSOFT.COM
http://www.microsoft.com/App.xap?foo=bar HTTP://WWW.MICROSOFT.COM/APP.XAP HTTP://WWW.MICROSOFT.COM
http://www.microsoft.com:80/App.xap HTTP://WWW.MICROSOFT.COM/APP.XAP HTTP://WWW.MICROSOFT.COM
http://www.microsoft.com:8080/App.xap HTTP://WWW.MICROSOFT.COM:8080/APP.XAP HTTP://WWW.MICROSOFT.COM:8080
http://Microsoft.com/App.xap HTTP://MICROSOFT.COM/APP.XAP HTTP://MICROSOFT.COM
https://www.microsoft.com/App.xap HTTPS://WWW.MICROSOFT.COM/APP.XAP HTTPS://WWW.MICROSOFT.COM
http://www.microsoft.com/demo.xap HTTP://WWW.MICROSOFT.COM/DEMO.XAP HTTP://WWW.MICROSOFT.COM

安全的 HTTPS URL 也會產生不同的身分識別,因為配置是不同 (HTTPS 而非 HTTP)。最後一個 URL 列在 [圖 2 ] 會在資料表中, 有在不同的應用程式識別,比前四個的 URL,但是它必須相同表示這些兩個應用程式可以選擇在其共用的網站的存放區中儲存資料在用戶端上資料共用彼此的網站識別]。

fig03.gif

[圖 3 隔離儲存區配額群組

配額

配額會是可由應用程式隔離的儲存空間的數量的限制。這包括了儲存在隔離儲存區,以及一些額外負荷,為每個目錄中的資料和建立 (1KB 每個) 的新檔案。

不同於在的.NET Framework Silverlight 會使用一個稱為配額的群組管理隔離儲存區 (Isolated Storage) 中的配額的概念。在配額群組是一的群組,共用相同的配額的隔離儲存區。在 Silverlight,儲存區會分組網站,讓所有的應用程式具有相同的站台識別共用相同的隔離儲存區配額。例如,Microsoft.com 上所裝載的所有應用程式會共用相同的配額。

隔離儲存區可以有零個或更多的配額群組。圖 3 ] 顯示兩個假設性的配額群組: 一個用於 microsoft.com,另一個用於 blogs.microsoft.com。每個的配額群組都具有在大部分的一個共用的網站儲存區及零個或多個應用程式儲存區。

依預設值,每個 [配額] 群組指派給 1 MB 的預設配額。這應該是足夠的空間,將簡單的設定] 和 [文字檔案儲存在隔離儲存區的應用程式。不過,因為來自相同網站的所有應用程式間共用配額,可以輕易地會達到配額如果只是其中一個應用程式使用較大的空間。如果站台的主控數個 Silverlight 應用程式每個應用程式在如果要在隔離儲存區中儲存資料的可用的空間量可以快速地降低。此外,如果應用程式需要在用戶端上儲存大量資料,1MB 的可用空間不會永遠為足夠。

若要解決這,如果應用程式需要更多空間,隔離儲存區 (Isolated Storage) 中的,它可以要求較大的配額。當應用程式會要求較大的配額時,Silverlight 就會提示端使用者允許或拒絕要求。下列程式碼會顯示如何要求較大的配額:

using (var store = IsolatedStorageFile.GetUserStoreForApplication()) {
    // 5 MB of isolated storage space is needed
    int spaceNeeded = 1024 * 1024 * 5;

    if (store.AvailableFreeSpace < spaceNeeded) {
        if (store.IncreaseQuotaTo(store.Quota + spaceNeeded)) {
            // The user accepted the request
        }
    }
}

在這個的程式碼,AvailableFreeSpace] 屬性,用來判斷多少可用的空間可在隔離儲存區中。 程式碼會知道它需要的可用空間的 5MB。 如果無法使用 [5MB 它藉由呼叫傳遞要求的配額大小以位元組為單位的 IncreaseQuotaTo 要求較大的配額 (在這個案例目前的配額,加上額外的空間是需要的)。

呼叫 IncreaseQuota 必須進行從一個的使用者 \ uc1 \ u21843? 動事件例如按鈕啟動 (Button-Click 事件處理常式內。 如果未呼叫使用者 \ uc1 \ u21843? 動事件,Silverlight 不會提示使用者和要求將被拒絕 (則方法會傳回 False)。 如果從呼叫使用者的初始事件和使用者允許的要求 IncreaseQuotaTo 傳回 true 群組的配額提高與至要求的大小。

因為每個在 Silverlight 的網站配額,您可以在主控您的 Silverlight 應用程式以不同方式視您的網站和應用程式的需求。 例如,請想像您要建立 Silverlight 的視訊播放程式,將使用者的上 10 個我的最愛影片儲存在隔離儲存區中。 每個視訊可以最多 10MB,這表示應用程式將需要增加配額為超過 100 MB。 您無法在您的主要網站上 (例如,contoso.com/Player.xap) 如果 Player.xap 是只在網站上所裝載的 Silverlight 應用程式可能會正常運作的裝載應用程式。 但是,如果 contoso.com 上的其他許多 Silverlight 應用程式它們將所有競爭的隔離儲存區 (Isolated Storage) 中的的分享空間。

為了解決這個問題,您可以考慮裝載它自己的子網域 (例如 Player.contoso.com/Player.xap) 上視訊的播放程式應用程式。 同樣地,如果要建立一組共用資料所需要的 Silverlight 應用程式您要裝載所有相同的網站上的及確定它們也一起運作。

Silverlight 會使用配額的群組,來使它更容易使用者管理隔離儲存區,在他們的電腦上使用。 代替所出現的 URL 洗衣清單到不同的 Silverlight XAP 檔案,使用者會出現的網站使用隔離儲存區的清單。 這的種方式使用者可以快速地決定哪些網站信任和哪些網站他們不信任其電腦上儲存資料。

使用者,隔離儲存區稱為應用程式儲存區中。 使用者可以管理隔離儲存區,使用 [Silverlight 組態] 對話方塊。 若要開啟對話方塊,請在網頁瀏覽器中執行任何的 Silverlight 應用程式上按一下滑鼠右鍵,及按一下 [Silverlight 的設定,在出現的功能表中]。 然後按一下 [應用程式儲存區] 索引標籤在 [Silverlight 組態] 對話方塊。 這個索引標籤會列出目前使用目前使用的大小和配額的隔離的儲存每個 Web 站。 此清單會是基本上配額的群組的清單。 從這裡,使用者可以刪除群組或啟用和停用隔離儲存區。

檔案和目錄

在隔離儲存區中建立目錄和檔案很容易。 請看一下 [圖 4] 。 在此您會看到可用來建立目錄的 CreateDirectory。 您可以建立最上層目錄,以及子目錄。 若要取得存放區的目錄清單,使用 [GetDirectoryNames]。

[圖 4 中建立目錄和檔案

using (var store = IsolatedStorageFile.GetUserStoreForApplication()) {
    store.CreateDirectory(@"dir1");
    store.CreateDirectory(@"dir1\subdir1");
    store.CreateDirectory(@"dir1\subdir2");
    store.CreateDirectory(@"dir2");

    string[] topLevelDirs = store.GetDirectoryNames(); // { "dir1", "dir2" }
    string[] dir1SubDirs = store.GetDirectoryNames(@"dir1\*"); 
    // { "subdir1", "subdir2" }

    store.CreateFile(@"toplevel.txt");
    store.CreateFile(@"dir1\subdir1\subfile.txt");

    string[] files = store.GetFileNames(); // { "toplevel.txt" }
    string[] subfiles = store.GetFileNames(@"dir1\subdir1\*");
    // { "subfile.txt" }
}

也會接受支援單一字元的字串 searchPattern GetDirectoryNames 的多載 (」 嗎? 」) 和 multi-character (「 * 」) 萬。 請注意如何在 multi-character (「 * 」) 萬用於取得 dir1 」 內所包含的目錄。 建立檔案是類似於建立目錄: 在存放區或內部目錄的根目錄中建立檔案。

建立隔離儲存區 (Isolated Storage) 中的的檔案和目錄時, 請相對的隔離儲存區的路徑會在內部擴展成完整的系統路徑的注意 (Silverlight 應用程式從未見這些的完整路徑)。 完整的路徑會受限於 260 個字元 Windows 和 Mac。 將因此雖然您在隔離儲存區內的相對路徑只能是 10 個字元的 10 個字元會轉換成較長路徑附加至隔離儲存區位於檔案系統上的根目錄的系統路徑時。 如果產生的系統路徑最後的超過 260 個字元的是例外。

隔離儲存區的位置視目前使用者及作業系統而定。 [圖 1 ] 回中您會看到隔離儲存區 Windows Vista、 Windows XP 和 Mac OS X 上的位置。

Microsoft\Silverlight\is 目錄會包含內部的隔離儲存區的結構。 這是其中配額的群組、 儲存、 簿記的資料及等等的資訊儲存,與在實際的資料一起由 Silverlight。 檔案和目錄在這個目錄內的細節不重要的 (這些是保留權利,在未來版本中變更的實作詳細資料,),但它一點要注意的目錄結構不會加入額外的負荷的完整路徑長度]。

舉例來說,假設 Silverlight 應用程式已建立名為 foo.txt 其應用程式存放區的根目錄檔案的方法。 在 Windows Vista,檔案在完整的 obfuscated 的系統路徑看起來像這:

C:\Users\<user>\AppData\LocalLow\Microsoft\Silverlight\is\plnvdo2y.zmg\
01ftptzg.h3o\1\s\4onbrsocvqffhjl0kn0sfxcidggvvqzoyl1to4ulrpif1vkwyaaahaa\f\foo.txt

在 Windows XP 上它看起來像這樣:

C:\Documents and Settings\<user>\Local Settings\Application
Data\Microsoft\Silverlight\is\plnvdo2y.zmg\01ftptzg.h3o\1\s\
4onbrsodcvqffhjl0kn0sfxcidggvvqzoylto4ulrpif1vkwyaaahaa\f\foo.txt

並在 Mac OS X 上它看起來像這樣:

/Users/<user>/Library/Application
Support/Microsoft/Silverlight/is/plnvdo2y.zmg/01ftptzg.h3o/1/s/
4onbrsodcvqffhjl0kn0sfxcidggvvqzyl1to4ulrpif1vkwyaaahaa/f/foo.txt

假設 <user> 10 個字元 foo.txt 以完整路徑長度是在 Windows Vista,Windows XP,190 字元 158 字元,並且 167 字元在 Mac OS X 上。 想它更通常,隔離儲存區路徑的限制為 109 的字元,在 Windows Vista 上 」、 「 在 Windows XP,77 字元和 「 假設目前使用者的使用者的名稱會 10 個字元的長度的 Mac OS X 上 100 個字元。

為了安全,最佳作法是要保留越小越好以防止完整的路徑到達 260 個字元限制的隔離儲存區的路徑。

一的有趣件事来注意 [圖 1 ] 中的位置相關會是隔離儲存區,並不是瀏覽器的網際網路暫存檔的一部分。 這表示跨所有支援的瀏覽器共用的隔離儲存區,且您 (或您的使用者要精確) 清除 Internet 暫存檔案,不會刪除隔離儲存區的內容。

這是原本設計,因為應用程式可以儲存在其他的喜好設定以及使用者可能不想要隨著網際網路暫存檔一併被刪除設定的隔離儲存區的使用者建立的資料,(例如文件和相片)。 若要刪除隔離儲存區的內容,使用 [Silverlight 組態對話方塊如前所述。

請注意雖然隔離儲存區的位置模糊化,並且儲存區會彼此隔離的資料儲存在隔離儲存區不受保護的其他一件事 (也就是,它不會加密)。 這表示在電腦上執行其他 (非 Silverlight) 應用程式可能能夠存取資料。 如果要在隔離儲存區中儲存機密資料加密資料儲存它之前 (有加密 Silverlight 中可用的 API,請參魷 \ cs6 \ f1 \ cf6 \ lang1024 System.Security.Cryptography MSDN Library) 上。

IsolatedStorageSettings

Silverlight 會包含一個新的便利性類別,稱為 IsolatedStorage­settings,可以用來在隔離儲存區中儲存物件,快速且輕鬆地。 IsolatedStorageSettings 都是字典集合,支援關鍵值組,在應用程式存放區或網站的存放區中儲存的。 它自動會處理的序列化物件,並儲存在隔離儲存區中。 序列化的物件會儲存呼叫 __LocalSettings 的隔離儲存區中的檔案。

[圖 5 ] 中的程式碼會顯示如何將簡單物件儲存在應用程式存放區中使用 IsolatedStorageSettings。 我在這裡定義簡單類別 MySettings 呼叫三個屬性: 寬度、 高度和色彩。 然後,我建立 MySettings 的執行個體,並填入一些值。 接下來,我將它加入 IsolatedStorageSettings.ApplicationSettings 設定機碼下。

最後我呼叫儲存的序列化物件並將儲存至應用程式存放區的序列化的資料。 擷取物件剛好是一樣簡單:

MySettings settings;
if (!IsolatedStorageSettings.ApplicationSettings.TryGetValue("settings",
    out settings)) {
    // Settings was not previously stored in isolated storage
    // create a new object initialized with default values
    settings = new MySettings {
        Width = 100,
        Height = 100,
        Color = Colors.Orange
    };
}

這個程式碼會使用 TryGetValue 方法,以避免例外狀況,如果索引鍵未找到 (表示資料有先前儲存)。 [圖 5 中的程式碼會將物件儲存至應用程式存放區中。 若要將物件儲存至網站儲存區中,請在代替 IsolatedStorageSettings.ApplicationSettings 使用 IsolatedStorageSettings.SiteSettings。

[圖 5 至應用程式存放區中儲存物件

public class MySettings {
    public int Width { get; set; }
    public int Height { get; set; }
    public Color Color { get; set; }
}
var settings = new MySettings {
    Width = 200,
    Height = 300,
    Color = Colors.Blue
};

IsolatedStorageSettings.ApplicationSettings["settings"] = settings;
IsolatedStorageSettings.ApplicationSettings.Save();

如果您僅需要儲存簡單的物件或設定值,隔離儲存區 (Isolated Storage) 中的,使用 IsolatedStorageSettings 會使將大量的意義。但如果您需要更細微控制隔離儲存區中儲存資料的格式或儲存大量的資料,如果您將可能會想要使用 「 檔案及資料流為基礎的隔離儲存體 API。

如在 Silverlight 中隔離的存放區需詳細請參閱在 2 月 2009 Cutting Edge.

您問題或意見寄至clrinout@Microsoft.com.

Justin Van Patten 是 Microsoft CLR 團隊在專案經理,他負責在基底類別的程式庫。他可以透過在 BCL 小組部落格達到blogs.msdn.com/bclteam.