Asp.Net에는 페이지의 ViewState가 생성되는 방식 (암호화, Mac 추가, ViewStateUserKey)에 영향을 줄 수있는 몇 가지 옵션이 있습니다.ViewState의 맞춤 구현을 할 수 있습니까?
구성을 기반으로하지 않고 직렬화 및 암호화를위한 다른 알고리즘을 사용하는 자체 클래스에서 직접 만들고 싶습니다. 이것이 가능한가?
Asp.Net에는 페이지의 ViewState가 생성되는 방식 (암호화, Mac 추가, ViewStateUserKey)에 영향을 줄 수있는 몇 가지 옵션이 있습니다.ViewState의 맞춤 구현을 할 수 있습니까?
구성을 기반으로하지 않고 직렬화 및 암호화를위한 다른 알고리즘을 사용하는 자체 클래스에서 직접 만들고 싶습니다. 이것이 가능한가?
예, 가능합니다. 예를 들어, 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;
}
}
}
좋아 보인다. 이 클래스는 .Net 구현과 다른 점이 무엇입니까? .Net은 값의 암호화를 처리합니까? 아니면 직접 처리 할 수 있습니까? –
'StateFormatter.Serialize'를 얻으면 viewstate 콘텐트가 생기고 필요한 방식으로 처리 할 수 있습니다. 필자의 경우에는 zip 라이브러리를 압축했습니다. –
예 자신의 PageStatePersister 클래스를 구현해야합니다. MSDN 페이지는 어떻게 작동하는지 예제를 보여줍니다.
우리는 파일 시스템으로 오프로드 한 비교적 큰 ViewState를 가지고 실제 페이지에서 훨씬 더 컴팩트 한 GUID로 대체했습니다.
당신의 목표는 여기에 무엇을 당신은
Page
에서PageStatePersister
을 무시하고PageStatePersister
에서 유래 된 클래스를 만들어야합니다? 나는 사람들이 만든 사용자 정의 viewstate 공급자와 일해야만했고, 그것이 나를 위해 한 유일한 일은 내가 알려진 표준을 따르지 않는 사람을 목 졸라 죽이고 싶도록 만드는 것이 었습니다. –@JoeEnos ViewState는 블랙 박스 여야합니까? 바로 지금 나는 내 'Server.TransferRequests'로 멋지게 놀지 않는 Asp.Net을 교묘히 망치고 싶다. 일부 응용 프로그램 수준의 보안 설정을 지정해야합니다. 이제 내 보안은 구성에 의해 설정됩니다. –