Silverlight - Lưu trữ biệt lập

Cơ chế truy cập tệp thứ ba là Isolated Storage, cung cấp bộ nhớ liên quan đến người dùng đã đăng nhập. API trình bày dữ liệu thông quaStream lớp từ .NET System.IOkhông gian tên. Do đó, giống như các cơ chế khác mà chúng tôi đã xem xét cho đến nay, bạn có thể sử dụng các loại khác trongSystem.IO để làm việc với các luồng, cho phép bạn lưu trữ dữ liệu văn bản hoặc dữ liệu nhị phân.

Một số tính năng quan trọng là -

  • Cơ chế lưu trữ này được gọi là Isolated Storage vì cửa hàng được phân vùng và ứng dụng Silverlight chỉ có quyền truy cập vào một số phần nhất định.

  • Bạn không thể truy cập bất kỳ dữ liệu cũ được lưu trữ nào. Trước hết, cửa hàng được phân vùng cho mỗi người dùng. Ứng dụng Silverlight không thể có quyền truy cập vào cửa hàng cho người dùng khác với người dùng đã đăng nhập và đang chạy ứng dụng.

  • Điều này không liên quan đến bất kỳ cơ chế nhận dạng nào mà ứng dụng web của bạn có thể sử dụng. Đó là một điểm quan trọng cần nhớ vì một số người dùng chung máy tính không bận tâm đến các tài khoản Windows riêng biệt, và chỉ quen đăng nhập và đăng xuất khỏi các trang web mà họ sử dụng.

Sử dụng bộ nhớ biệt lập

Lưu trữ Isolated không phải là duy nhất đối với Silverlight. API ban đầu được giới thiệu choWindows Formsđể cho phép các ứng dụng khởi chạy từ web lưu trữ dữ liệu cục bộ trong các tình huống tin cậy một phần. Việc triển khai là khác nhau và không có cách nào để truy cập đầy đủ.NET Bộ nhớ cách ly của Framework với của Silverlight hoặc ngược lại.

Tuy nhiên, nếu bạn đã sử dụng nó, các bước ở đây sẽ trông rất quen thuộc.

  • Bạn bắt đầu bằng cách yêu cầu cửa hàng cụ thể của người dùng. Trong trường hợp này, chúng tôi đang yêu cầu một cái cho ứng dụng. Nếu chúng tôi muốn cửa hàng trên mỗi trang web được chia sẻ bởi tất cả các XAP trên trang web, chúng tôi sẽ gọiGetUserStoreForSite thay thế.

  • Một trong hai phương thức trả về một IsolatedStorageFile đối tượng, là một cái tên khá vô ích vì nó đại diện cho một thư mục, không phải một tệp.

  • Để truy cập một tệp, bạn cần yêu cầu IsolatedStorageFile cho một Stream.

  • Chúng tôi sử dụng IsolatedStorageFileStream lớp và phương thức khởi tạo của nó yêu cầu bạn chuyển IsolatedStorageFile đối tượng như một đối số.

  • Vì vậy, chúng tôi đang tạo một tệp mới trong cửa hàng. Vị trí chính xác của tệp trên đĩa là không xác định.

  • Thư mục chứa có các phần tử được ngẫu nhiên hóa để không thể đoán được tên của tệp.

  • Nếu không có điều này, các trang web độc hại có thể đặt một tệp trên máy tính của người dùng và sau đó xây dựng một URL tệp để mở nó, với hy vọng đánh lừa người dùng nhấp vào một liên kết thực thi một chương trình cục bộ.

  • Có nhiều biện pháp bảo vệ khác được tích hợp trong Windows cố gắng ngăn chặn điều này xảy ra, nhưng đây là một lớp bảo vệ khác trong trường hợp các biện pháp khác đã bị vô hiệu hóa hoặc bị bỏ qua bằng cách nào đó.

  • Tệp sẽ được lưu trữ ở đâu đó bên trong hồ sơ của người dùng, nhưng đó là những gì bạn có thể biết về nó. Của bạnIsolatedStorageFileStream sẽ không báo cáo vị trí thực sự của nó.

Chúng ta hãy xem một ví dụ đơn giản theo dõi số lần ứng dụng đã được chạy. Dưới đây là mã XAML.

<UserControl x:Class = "StoreRunCount.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d" 
   d:DesignHeight = "300" d:DesignWidth = "400"> 
   
   <Grid x:Name = "LayoutRoot" Background = "White"> 
      <TextBlock x:Name = "runCountText" FontSize = "20" /> 
   </Grid> 
	
</UserControl>

Đây là mã C # trong đó Isolated storage được sử dụng.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

using System.IO.IsolatedStorage; 
using System.IO;

namespace StoreRunCount { 

   public partial class MainPage : UserControl {
	
      const string RunCountFileName = "RunCount.bin"; 
		
      public MainPage() { 
         InitializeComponent();  
         int runCount = 0;  
			
         using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { 
			
            if (store.FileExists(RunCountFileName)) { 
               using (var stm = store.OpenFile(RunCountFileName, 
                  FileMode.Open, FileAccess.Read)) 
               using (var r = new BinaryReader(stm)) { 
                  runCount = r.ReadInt32(); 
               }  
            } 
			
            runCount += 1;  
            using (var stm = store.OpenFile(RunCountFileName, 
               FileMode.Create, FileAccess.Write)) 
					
            using (var w = new BinaryWriter(stm)) { 
               w.Write(runCount); 
            } 
         }  
			
         runCountText.Text = "You have run this application " + runCount.ToString() + " time(s)"; 
      } 
   }
}

Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy trang web sau đây sẽ hiển thị cho bạn biết bạn chạy ứng dụng này bao nhiêu lần.

Tăng hạn ngạch của bạn

Các ứng dụng có thể yêu cầu thêm dung lượng nếu số lượng ban đầu không đủ vì lý do nào đó. Không có gì đảm bảo rằng yêu cầu sẽ thành công. Silverlight sẽ hỏi người dùng xem họ có hài lòng khi cấp thêm dung lượng cho ứng dụng hay không.

Nhân tiện, bạn chỉ được phép yêu cầu thêm bộ nhớ để phản hồi thông tin nhập của người dùng, chẳng hạn như click. Nếu bạn cố gắng hỏi nó vào lúc khác, chẳng hạn như khi plugin tải hoặc trong trình xử lý bộ hẹn giờ, Silverlight sẽ tự động không thực hiện yêu cầu mà không cần người dùng nhắc. Hạn ngạch bổ sung chỉ có sẵn cho các ứng dụng mà người dùng đang tương tác.

Các IsolatedStorageFile đối tượng cung cấp ba thành viên để quản lý hạn ngạch -

  • AvailableFreeSpace
  • IncreaseQuotaTo
  • Quota

Có sẵn Không gian miễn phí

Thuộc tính AvailableFreeSpace cho bạn biết lượng hạn ngạch của bạn vẫn còn miễn phí.

Lưu ý rằng ngay cả một thư mục con trống cũng tiêu tốn một số hạn ngạch của bạn vì hệ điều hành cần phân bổ không gian trên đĩa để đại diện cho thư mục. Vì vậy, dung lượng khả dụng có thể nhỏ hơn tổng hạn ngạch, trừ đi tổng kích thước của tất cả các tệp của bạn.

TăngQuotaTo

Nếu bạn không có đủ dung lượng để tiếp tục, bạn yêu cầu thêm bằng cách gọi cho IncreaseQuotaTo phương pháp.

Hạn ngạch

Ở đây chúng tôi đang sử dụng thuộc tính thứ ba, Quota, để khám phá kích thước hạn ngạch hiện tại và sau đó chúng tôi sẽ thêm số tiền mà chúng tôi yêu cầu để có được hạn ngạch yêu cầu mới của chúng tôi.

Phương thức trả về một trong hai True hoặc là Falseđể cho biết liệu chúng tôi có được phân bổ những gì chúng tôi yêu cầu hay không. Lưu ý rằng Silverlight có thể quyết định phân bổ nhiều không gian hơn bạn yêu cầu.

Đây là một ví dụ đơn giản để tăng quota, khi nút được nhấp. Dưới đây là mã XAML.

<UserControl x:Class = "ChangeQuota.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d" 
   d:DesignHeight = "300" d:DesignWidth = "400"> 
   
   <Grid x:Name = "LayoutRoot" Background = "White"> 
      <TextBlock x:Name = "infoText" FontSize = "20" TextWrapping = "Wrap" />  
      <Button x:Name = "increaseQuota" Content = "Increase" HorizontalAlignment = "Center" 
         FontSize = "20" 
         VerticalAlignment = "Center" Click = "increaseQuota_Click" /> 
   </Grid>
	
</UserControl>

Đây là việc thực hiện click sự kiện trong đó hạn ngạch được tăng lên.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input;
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

using System.IO.IsolatedStorage;
  
namespace ChangeQuota { 

   public partial class MainPage : UserControl { 
	
      public MainPage() { 
         InitializeComponent(); 
      } 
	  
      private void increaseQuota_Click(object sender, RoutedEventArgs e) { 
         using (IsolatedStorageFile isoStore = 
            IsolatedStorageFile.GetUserStoreForApplication()) { 
               long newQuota = isoStore.Quota + 10240; 
					
               if (isoStore.IncreaseQuotaTo(newQuota)) { 
                  infoText.Text = "Quota is " + isoStore.Quota + ", free space: " + 
                  isoStore.AvailableFreeSpace; 
               } else { 
                  infoText.Text = "Meanie!"; 
               } 
         } 
      } 
   } 
}

Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy kết quả sau.

Khi bạn nhấp vào Increase, dấu nhắc xuất hiện. Nó yêu cầu tăngQuota lớn hơn 10KB so với bất kỳ giá trị nào hiện có.

Khi bạn nhấp vào Yes, sau đó nó sẽ in ra số lượng Quota có sẵn.

Chúng tôi khuyên bạn nên thực hiện các ví dụ trên để hiểu rõ hơn.