fc2ブログ

記事一覧

ViewStateの容量を減らしてセッションに保存する方法 | asp.net


今回は asp.net の ViewState について検証してみました。ViewState はWeb.config やコントロール毎の ViewStateMode プロパティで使用しないように変更することはできますが、その影響範囲が大きく、ポストバック時にコントロールの値が再描画されなくなったりしますので、むやみやたらに変更することは危険な行為となります。そこで調べましたところ他のプログラムには影響を最小限に留めながら ViewState を削減する方法(その代わりセッションに保存されます)がありました。


aspnet_viewstate_01.png



前提条件
・Windows 7 Professional 以降 / Windows Server 2008 R2 以降
・Visual Studio 2010 Professional 以降
・VB.NET
・.Net Framework 4.0 以降



1.PageAdapterを実装する

任意のプロジェクトに PageAdapter を継承したクラスを実装します。GetStatePersister をオーバーライドして 新しい SessionPageStatePersister インスタンスを返すように変更します。

BaseLibrary.Controls.BasePageAdapter.vb
Option Explicit On
Option Strict On

Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.Adapters
Imports System.Security.Permissions

Namespace Controls

    <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal)>
    Public Class BasePageAdapter
        Inherits PageAdapter

        Public Overrides Function GetStatePersister() As PageStatePersister
            'Return MyBase.GetStatePersister()
            Return New SessionPageStatePersister(Page)
        End Function

    End Class

End Namespace



2.BrowserFile.browserを実装する

ブラウザごとに処理を変更・制御することができる BrowserFile.browser を配置します。ブラウザーファイルは IE10 がリリースされた際に asp.net が IE10 を正しく認識しない不具合の対応をする際に使用しましたね。新しい項目を追加する際にブラウザーファイルを選択すると、App_Browsers フォルダも自動で作成してくれます。

aspnet_viewstate_02.png


aspnet_viewstate_03.png


BrowserFile.browser
<!--
既存のブラウザ定義は次の場所にあります。
<windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers
-->
<browsers>
<browser refID="Mozilla">
<controlAdapters>
<adapter
controlType="System.Web.UI.Page"
adapterType="BaseLibrary.Controls.BasePageAdapter" />
</controlAdapters>
</browser>
</browsers>

※adapterType にはプロジェクト名.名前空間.クラス名を記載します。



3.検証

DataSetをバインドしたページを表示してみます。開発者ツールでViewStateを確認すると以下のように大量のデータとなっていることが分かります。

aspnet_viewstate_04.png


PageAdapter を実装した場合、以下の画像の量までViewStateが減っています。見るからに少ない量となっていますね。

aspnet_viewstate_05.png


ViewStateに表示されているデータをコピーしてファイルに保存してみましたところ、29KBから1KBに減っていることが確認できました。

aspnet_viewstate_06.png


以上で既存のプログラムに修正を加えることなく ViewState をセッションに保存して容量を削減することで画面の描画速度を速くすることができました。しかしながら、セッションに保存するということはサーバーのリソースの負荷を上げますので、実際のリリース時にはしっかりと動作検証することをお勧めします。







最後までお読みいただきありがとうございます。
いかがでしたでしょうか。他にも asp.net に関連する記事を投稿しておりますのでよろしければご参考くださいませ。



関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。