2013-11-21 2 views
3

Asp.Net에는 페이지의 ViewState가 생성되는 방식 (암호화, Mac 추가, ViewStateUserKey)에 영향을 줄 수있는 몇 가지 옵션이 있습니다.ViewState의 맞춤 구현을 할 수 있습니까?

구성을 기반으로하지 않고 직렬화 및 암호화를위한 다른 알고리즘을 사용하는 자체 클래스에서 직접 만들고 싶습니다. 이것이 가능한가?

+1

당신의 목표는 여기에 무엇을 당신은 Page에서 PageStatePersister을 무시하고 PageStatePersister에서 유래 된 클래스를 만들어야합니다? 나는 사람들이 만든 사용자 정의 viewstate 공급자와 일해야만했고, 그것이 나를 위해 한 유일한 일은 내가 알려진 표준을 따르지 않는 사람을 목 졸라 죽이고 싶도록 만드는 것이 었습니다. –

+0

@JoeEnos ViewState는 블랙 박스 여야합니까? 바로 지금 나는 내 'Server.TransferRequests'로 멋지게 놀지 않는 Asp.Net을 교묘히 망치고 싶다. 일부 응용 프로그램 수준의 보안 설정을 지정해야합니다. 이제 내 보안은 구성에 의해 설정됩니다. –

답변

4

예, 가능합니다. 예를 들어, CodeProject에서 찾을 수있는 몇 가지 기사를 기반으로 뷰 상태 압축 논리를 작성했습니다.

// 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로 대체했습니다.

관련 문제