MYBLOG

欢迎来到小马哥的个人博客~

[原创]ASP.NET页面中去除VIEWSTATE视图状态乱码

2020-03-08学海无涯

      做过.net知道,如果使用ASP.NET引擎的服务器端控件,那么在ASP.NET页面中就会生成 __Viewstate隐藏域 ,__Viewstate隐藏域产生的“ 乱码 ”对网络爬虫是极其不友好!!!那么怎么办呢?有一下几种解决方案,在下边介绍给大家:

方案一:

    去掉form的标签的 runat="server" 属性的话,就可以不生成__viewstate隐藏域,但有些情况服务器端控件就没法正常使用了,所以在需要使用服务器端控件的时候就此方并不是太完美。

方案二:

给服务器端正控件的EnableViewState属性设置为false,此时我们发现网页的Viewstate有明显代码减少,但还是存在视图状态。。。

方案三:

   些方案需要了解.NET的一些基类,如 System.Web.dll 。

System.Web.dll封装了 LosFormatter 类。

在 MSDN 上对此类的描述是: 序列化 Web 窗体页的视图状态。

此时我们需要LosFormatter类里封装的Serialize方法,功能描述如下:将有限对象序列化 (LOS) 格式的对象转换为视图状态值并将结果放置在 System.IO.Stream 对象中。

去除“乱码”代码如下:

/// <summary>
  /// 去除VIEWSTATE乱码代码如下所示:
  /// </summary>
   protected  LosFormatter losFormatter = new LosFormatter();

  /// <summary>
  /// 序列化所有视图状态信息和控件状态信息。
  /// </summary>
  /// <param name="viewState">要在其中存储视图状态信息的 Object</param>
  protected override void SavePageStateToPersistenceMedium(object viewState)
  {
    string val = Request.Url + "__VIEWSTATE";
    System.IO.MemoryStream stream = new System.IO.MemoryStream();
    losFormatter.Serialize(stream, viewState);
    stream.Flush();
    Session[val] = stream;
  }