2010-10-28 31 views
5

Sự kiện vòng đời trang ASP.NET nào tôi có thể viết mã để xác định kích thước của ViewState được gửi đi? Ngoài ra, có thể xác định kích thước mà không phân tích cú pháp thông qua HTML được hiển thị (như thuộc tính trên đối tượng trang) hoặc phân tích cú pháp theo cách duy nhất không?Xác định kích thước của viewState của trang ASP.NET trước khi phục vụ trang

Điều tôi muốn làm là ghi lại kích thước, đặc biệt nếu chúng vượt qua một ngưỡng nhất định.

+0

Tôi đã sử dụng javascript và đăng nhập theo cách đó, nhưng @Aristos đã có câu trả lời cho chuyến tàu tư tưởng ban đầu của tôi. – slolife

Trả lời

4

Bạn có thể đi vào các chức năng có nghĩa là sẽ viết ViewState, các SavePageStateToPersistenceMedium. Đây là chức năng mà còn sử dụng để nén ViewState ...

Ví dụ ...

public abstract class BasePage : System.Web.UI.Page 
{ 
    private ObjectStateFormatter _formatter = new ObjectStateFormatter(); 

    protected override void SavePageStateToPersistenceMedium(object viewState) 
    { 
     MemoryStream ms = new MemoryStream();  
     _formatter.Serialize(ms, viewState);  
     byte[] viewStateArray = ms.ToArray(); 

     .... 

    } 
} 

Một số tài liệu tham khảo.
http://www.codeproject.com/KB/viewstate/ViewStateCompression.aspx
http://forums.asp.net/p/1139883/3836512.aspx
http://www.dotnetcurry.com/ShowArticle.aspx?ID=67&AspxAutoDetectCookieSupport=1

+0

Bạn có đề xuất anh ta ghi đè phương pháp này nói riêng không? Rằng sẽ làm việc. Nhưng sau đó anh ta phải thừa hưởng điều đó trong mọi trang, đúng không? Làm thế nào ông sẽ làm điều đó mà không làm lại mỗi trang? ~ Cấp, thêm một cái gì đó cho mỗi trang như là một OnSaveCompleted (hoặc bất cứ điều gì) sự kiện sẽ yêu cầu làm việc lại mỗi trang quá, vì vậy .../facepalm – jcolebrand

+1

@ drachenstern Bạn tạo BasePage, và sau đó trên codebehind bạn khai báo là cha mẹ không phải là System.Web.UI.Page, mà là BasePage. Có bạn cần phải thay đổi điều đó, trên tất cả các trang (không phải là xấu) ... Tôi nghĩ rằng đó cũng là một cách tự động nhưng tại thời điểm này tôi không chắc chắn 100% để trả lời nếu có thể ... – Aristos

+0

~ Yeah, chúng tôi đang suy nghĩ cùng một điều (tôi làm tương tự với MasterPages của tôi ... Tôi có một số mã được chia sẻ giữa tất cả) – jcolebrand

0

Bạn có thể sử dụng SaveStateCompleted, xảy ra ngay sau khi tất cả trạng thái đã được lưu vào ViewState. Để biết kích thước của viewstate, chỉ cần thực hiện một số ký tự sau khi gọi ToString trên ViewState.

ViewState.ToString.Count() 
+0

bước qua nó trong phản xạ, được gọi trước khi trang được hiển thị, không? Và vì nó chưa được viết, bạn không thể biết chắc chắn kích cỡ sẽ là gì, hay tôi đang thiếu thứ gì đó? trở lại phản xạ! – jcolebrand

0

Tôi nghĩ rằng, sau khi xem xét cơ chế Reflector'd cho Trang và làm thế nào nó xử lý ViewState, mà bạn sẽ cần phải đi đến một HttpModule để có được những gì bạn đang sau đó, nếu bạn muốn kích thước viewstate thực tế trên trang.

Tôi nói điều này bởi vì bạn sẽ phải lấy chuỗi chữ từ trang sau khi nó được hiển thị, điều này không xảy ra cho đến sau khi tất cả các sự kiện do người dùng xác định đã kích hoạt. Xem đầu ra phản xạ bên dưới (một phần):

  this.PerformPreRenderComplete(); 
      if (context.TraceIsEnabled) 
      { 
       this.Trace.Write("aspx.page", "End PreRenderComplete"); 
      } 
      if (context.TraceIsEnabled) 
      { 
       this.BuildPageProfileTree(this.EnableViewState); 
       this.Trace.Write("aspx.page", "Begin SaveState"); 
      } 
      if (EtwTrace.IsTraceEnabled(5, 4)) 
      { 
       EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_ENTER, this._context.WorkerRequest); 
      } 
      this.SaveAllState(); 
      if (EtwTrace.IsTraceEnabled(5, 4)) 
      { 
       EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_SAVE_VIEWSTATE_LEAVE, this._context.WorkerRequest); 
      } 
      if (context.TraceIsEnabled) 
      { 
       this.Trace.Write("aspx.page", "End SaveState"); 
       this.Trace.Write("aspx.page", "Begin SaveStateComplete"); 
      } 
      this.OnSaveStateComplete(EventArgs.Empty); 
      if (context.TraceIsEnabled) 
      { 
       this.Trace.Write("aspx.page", "End SaveStateComplete"); 
       this.Trace.Write("aspx.page", "Begin Render"); 
      } 
      if (EtwTrace.IsTraceEnabled(5, 4)) 
      { 
       EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_ENTER, this._context.WorkerRequest); 
      } 
      if (str != null) 
      { 
       this.ExportWebPart(str); 
      } 
      else 
      { 
       this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output)); 
      } 
      if (EtwTrace.IsTraceEnabled(5, 4)) 
      { 
       EtwTrace.Trace(EtwTraceType.ETW_TYPE_PAGE_RENDER_LEAVE, this._context.WorkerRequest); 
      } 
      if (context.TraceIsEnabled) 
      { 
       this.Trace.Write("aspx.page", "End Render"); 
      } 
      this.CheckRemainingAsyncTasks(false); 

Nếu không, bạn có thể lấy túi bầu và lặp lại nội dung của nó. Điều đó cũng hoạt động tốt, tùy thuộc vào chi tiết bạn muốn đi vào.

Các vấn đề liên quan