2013-11-21 38 views
3

Asp.Net有一些選項可以影響其ViewState生成頁面的方式(加密,添加mac,ViewStateUserKey)。是否可以製作ViewState的自定義實現?

我想自己做,而不是基於配置,但在我自己的類使用其他算法進行序列化和加密。這可能嗎?

+1

什麼這是你的目標是什麼?我不得不與人們構建的自定義視圖狀態提供者一起工作,它爲我做的唯一事情就是讓我想要扼殺那個不遵循任何已知標準的人。 –

+0

@JoeEnos ViewState應該是黑盒子吧?現在我願意扼殺Asp.Net,因爲我的'Server.TransferRequests'沒有和好玩。我需要設置一些應用程序級別的安全設置。現在我的安全性由配置設置。 –

回答

4

是的,這是可能的。例如,我基於CodeProject上的一些文章構建了視圖狀態壓縮邏輯。你需要覆蓋從PagePageStatePersister和創建PageStatePersister推導類:

// In your page: 
protected override PageStatePersister PageStatePersister 
{ 
    get { return new ViewStateCompressor(this); } 
} 

,並創建一個新的類:

public class ViewStateCompressor : PageStatePersister 
{ 
    private const string ViewStateKey = "__VSTATE"; 
    public ViewStateCompressor(Page page) : base(page) 
    { 
    } 

    private LosFormatter stateFormatter; 
    protected new LosFormatter StateFormatter 
    { 
     get { return this.stateFormatter ?? (this.stateFormatter = new LosFormatter()); } 
    } 

    public override void Save() 
    { 
     using (StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture)) 
     { 
      // Put viewstate data on writer 
      StateFormatter.Serialize(writer, new Pair(base.ViewState, base.ControlState)); 

      // Handle your viewstate data 
      // byte[] bytes = Convert.FromBase64String(writer.ToString()); 

      // Here I create another hidden field named "__VSTATE" 
      ScriptManager.RegisterHiddenField(Page, ViewStateKey, Convert.ToBase64String(output.ToArray())); 
     } 
    } 

    public override void Load() 
    { 
     byte[] bytes = Convert.FromBase64String(base.Page.Request.Form[ViewStateKey]); 
     using (MemoryStream input = new MemoryStream()) 
     { 
      input.Write(bytes, 0, bytes.Length); 
      input.Position = 0; 

      // Handle your viewstate data 

      Pair p = ((Pair)(StateFormatter.Deserialize(Convert.ToBase64String(output.ToArray())))); 
      base.ViewState = p.First; 
      base.ControlState = p.Second; 
     } 
    } 
} 
+0

看起來不錯。這個類與.NET實現有什麼不同? .Net處理值的加密還是我可以自己處理? –

+0

一旦你獲得了'StateFormatter.Serialize',你就會擁有viewstate內容,你可以用你需要的任何方式處理它。在我的情況下,我只是壓縮一些zip庫。 –

1

是的,你需要實現你自己的PageStatePersister類。 MSDN頁面顯示了它的工作原理示例。

我們將一個相當大的ViewState分流到文件系統,並用實際頁面上更緊湊的GUID替換它。

相關問題