C# 是否可以自定义ViewState的实现?
Asp.Net有一些选项可以影响页面的ViewState生成方式(加密、添加mac、ViewStateUserKey)C# 是否可以自定义ViewState的实现?,c#,asp.net,.net,viewstate,C#,Asp.net,.net,Viewstate,Asp.Net有一些选项可以影响页面的ViewState生成方式(加密、添加mac、ViewStateUserKey) 我想自己做这件事,不是基于配置,而是基于我自己的类,该类使用其他算法进行序列化和加密。这可能吗?是的,您需要实现自己的类。MSDN页面向您展示了它的工作原理示例 我们将一个相当大的ViewState卸载到文件系统中,并在实际页面上用一个更紧凑的GUID替换它。是的,您需要实现自己的类。MSDN页面向您展示了它的工作原理示例 我们将一个相当大的ViewState卸载到文件系统中,
我想自己做这件事,不是基于配置,而是基于我自己的类,该类使用其他算法进行序列化和加密。这可能吗?是的,您需要实现自己的类。MSDN页面向您展示了它的工作原理示例
我们将一个相当大的ViewState卸载到文件系统中,并在实际页面上用一个更紧凑的GUID替换它。是的,您需要实现自己的类。MSDN页面向您展示了它的工作原理示例
我们将一个相当大的ViewState卸载到文件系统中,并在实际页面上用一个更紧凑的GUID替换它。是的,这是可能的。例如,我根据CodeProject上的一些文章构建了一个视图状态压缩逻辑。您需要从
页面
重写PageStatePersister
,并创建一个派生自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;
}
}
}
是的,有可能。例如,我根据CodeProject上的一些文章构建了一个视图状态压缩逻辑。您需要从
页面
重写PageStatePersister
,并创建一个派生自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;
}
}
}
你的目标是什么?我不得不与人们创建的自定义viewstate提供程序合作,它为我做的唯一一件事就是让我想扼杀那个不遵守任何已知标准的家伙。@JoeEnos viewstate应该是黑匣子,对吗?现在我愿意扼杀Asp.Net,因为它没有很好地使用我的
服务器.TransferRequests
。我需要设置一些应用程序级别的安全设置。现在,我的安全性由配置设置。您的目标是什么?我不得不与人们创建的自定义viewstate提供程序合作,它为我做的唯一一件事就是让我想扼杀那个不遵守任何已知标准的家伙。@JoeEnos viewstate应该是黑匣子,对吗?现在我愿意扼杀Asp.Net,因为它没有很好地使用我的服务器.TransferRequests
。我需要设置一些应用程序级别的安全设置。现在我的安全性由配置设置。看起来不错。这个类与.Net实现有什么不同?.Net处理值的加密还是我自己处理?一旦获得StateFormatter.Serialize
,您将拥有viewstate内容,并且可以以任何需要的方式处理它。在我的情况下,我只是压缩一些压缩库。看起来不错。这个类与.Net实现有什么不同?.Net处理值的加密还是我自己处理?一旦获得StateFormatter.Serialize
,您将拥有viewstate内容,并且可以以任何需要的方式处理它。在我的例子中,我只是使用一些压缩库。