Web design and hosting, database, cloud and social media solutions that deliver business results
  • ビジネスソリューション
    • データベースサービス
      • サーバーのアップグレードと DBA サービス
      • データウェアハウス サービス
      • データ統合
      • パワーBI
    • ウェブサイトデザイン
      • Web サイトのセキュリティ
      • Web サイトの最適化
      • ロゴデザイン
      • 支払いゲートウェイ
      • テクニカルツール
    • ビジネスサービス
      • Google クラウド サービス
      • アマゾン ウェブ サービス
      • マイクロソフト アズール
    • ソーシャルメディア
    • マイクロソフトオフィス
  • 学校
    • テスト環境
    • 学習データベース
      • 基礎
      • SQL Serverデータ
      • SQLServerのメンテナンス
      • SQL Serverの日付の使用
      • SQLServerピボットの使用-ピボット解除
      • SQLServer関数の使用
      • オープンクエリを取得
      • ツール
    • ウェブデザインを学ぶ
      • Ousia コンテンツ管理システムの構築
      • ASP-NET の使用
      • CSS の使用
      • JavaScript の使用
    • クラウドと IT サービスの学習
      • タスク スケジューラ エラー 2147943645
      • OpenSSL での SSL の要求と PFX ファイルの生成の簡単な手順
    • ソーシャル メディアの使用
      • Facebookアカウントを個人用からビジネス用に変更する
      • Google レビューを依頼する
      • ソーシャル メディアの取り組みをどこに集中させるかを選択する
      • ソーシャル メディアの画像サイズ
      • メタ データを使用してソーシャル メディア画像を設定する
  • 私たちに関しては
    • ブログ
      • Google コア アップデート 2020 年 1 月
      • インターネット上のウェブサイトに関する最も厄介なこと
      • ウェブサイトの広告リーフレットのコンテンツを選択する方法
      • エントリーレベルのゲーム機の構築
      • オンライン詐欺の防止
      • ギグエコノミーのスキマー
      • ホットチリインターネット閉鎖
      • 無料のベクター グラフィックスのトップ 5 Web サイト
    • キャリア
      • 翻訳者 英日
      • 英語-トルコ語翻訳者
    • チーム
      • アイセ・ハー
      • アリ アル アミン
      • ギャビン・クレイトン
      • サイガングー
      • スーリヤ・ムッカマラ
      • スニール・クマール
      • チェスターコッパーポット
    • ポートフォリオ
English (EN-GB)English (EN-US)हिंदी (HI)italiano (IT)日本語 (JA)Português (PT)

セッション状態の置き換え

ASP.NET アプリケーションでのセッション状態の置き換えについて

約

私はここ数年、カスタムのコンテンツ管理システムをいじくり回してきましたが、その結果、Ousia の最新バージョンが完成しました。

以前のバージョンでは、さまざまなページ ルート データ項目を設定するカスタム要求ハンドラーと組み合わせて、ポストバック間で項目を維持したり、要求が発生している間情報を保持したりするために、常にASP.NET セッション状態を使用していました。

セッション状態はデータを保存する便利な方法ですが、すぐに使用できる機能にはいくつかの欠点があることがわかりました。

  • ユーザーが長いドキュメントを編集していた場合、アイテムを保存する前にセッションが終了する可能性があります
  • アプリケーション全体を実行する単一の IIS プロセスに制限されます。

私は、Ousia を標準のワーカー プロセスから Web ガーデンに移行することを検討しており、データのクロス プロセスを記憶する別の方法を見つける必要があることを知っていました。以前にオンラインで使用または遭遇したソリューションのいくつかには、さまざまな長所と短所が含まれていました。

Options

  • HttpContext
  • ViewState
  • Cookies
  • SessionState in SQL Server

約

ロジックは、データの目的を 2 つに分割する必要があることを (とにかく私のロジックで) 指示しました。

クロスページ/クロスリクエストのデータでしたか、それともリクエストの処理にかかった時間だけ覚えておく必要があったものでしたか?

リクエスト処理値 – Easy Win

リクエストの処理にかかった時間のデータを記憶するために SessionState を使用する必要がないことにすぐに気付きました。これは HttpContext で簡単に処理できました。

複雑なポストバック シナリオでこれを使用して、これらの線に沿って、要求チェーンのさらに下にある画面の可視性を設定できます。私が推奨するこの切り替えを行うには、以下のコードに似たものを見ています。

VB.NET

Session("YourVariable") = "Test"
Dim TestSession As String = Session("YourVariable").ToString
HttpContext.Current.Items("YourVariable") = "Test"
Dim TestContext As String = HttpContext.Current.Items("YourVariable").ToString

リクエスト処理値 – Easy Win

それはとても簡単で、文字通りコードをセッションからコンテキストに変更するだけで、問題の半分は解消されました。

ただし、ポストバック間でデータを記憶するプロセスは解決されませんでした。それにはさらに検討が必要です。


クロスリクエストデータ

データ クロス リクエストを記憶するために Cookie を使用することにしましたが、データの保存とアクセスに関して次のレベルに引き上げようと考え、一連の関数とサブルーチンを作成して、他の場所でこのデータに簡単にアクセスできるようにしました。クロスサブドメイン.

ドメイン機能

デフォルトでは、IIS で作成された Cookie は完全なドメイン レベルであり、そのドメインのみがアクセスできます。これは、Claytabase サイトと gscalayton.net サイトの両方にあるさまざまなサブドメインでは役に立ちません。幸いなことに、Cookie ドメインを設定できます。

他の部分の執筆中に、このドメイン機能を再利用していたことが判明したため、別の機能に移動しました。これは、内部サーバーに Cookie を設定するために必要でした。

VB.NET

Public Shared Function UpdDomain(Domain As String) As String
    Dim DomainStr As String = ""
    If Domain.IndexOf(".") > -1 Then
        DomainStr = Domain
    Else
        DomainStr = ""
    End If
    Return DomainStr
End Function

クッキーの有効期限

はい、Cookie は、送信した有効期限とともに戻ってくることはありません。

重要なヒント – 有効期限を Cookie 内の目盛りとして保存します。

VB.NET

Public Shared Function GetExpires(Cookie As HttpCookie) As Long
    Dim Expires As Long = 0
    If Not IsNothing(Cookie("Expires")) Then
        Try
            Expires = Cookie("Expires").ToString
        Catch
        End Try
    End If
    Return Expires
End Function

Cookie 値の設定

ここで、Cookie 値を作成して設定するには、2 つのサブルーチンが必要です。これらが機能するには、パラメーターとして要求と応答の両方、Cookie 名、ドメイン、およびタイムアウト (分単位) が必要です。

値の設定はサブルーチンの 2 番目で行われ、追加の Field と Value を文字列として渡すだけです。

VB.NET

Public Shared Sub PersistenceCreate(Request As HttpRequest, Response As HttpResponse, CookieName As String, Domain As String, TimeOut As Integer)
    If IsNothing(Request.Cookies(CookieName)) Then
        Dim PersistenceCookie As New HttpCookie(CookieName)
        Domain = UpdDomain(Domain)
        PersistenceCookie.Domain = Domain
        PersistenceCookie.Expires = DateAdd(DateInterval.Minute, TimeOut, Now.ToUniversalTime())
        PersistenceCookie("Expires") = PersistenceCookie.Expires.Ticks
        Response.Cookies.Add(PersistenceCookie)
    End If
End Sub
Public Shared Sub PersistenceSet(Request As HttpRequest, Response As HttpResponse, CookieName As String, Domain As String, TimeOut As Integer,
                                 Field As String, Value As String)
    If IsNothing(Request.Cookies(CookieName)) Then
        PersistenceCreate(Request, Response, CookieName, Domain, TimeOut)
    End If
    Dim PersistenceCookie As HttpCookie = Request.Cookies(CookieName)
    Dim Expires As Long = GetExpires(PersistenceCookie)
    Domain = UpdDomain(Domain)
    PersistenceCookie.Domain = Domain
    If Expires < DateAdd(DateInterval.Minute, TimeOut, Now.ToUniversalTime()).Ticks Then
        PersistenceCookie.Expires = DateAdd(DateInterval.Minute, TimeOut, Now.ToUniversalTime())
        PersistenceCookie("Expires") = PersistenceCookie.Expires.Ticks
    Else
        PersistenceCookie.Expires = New DateTime(Expires)
        PersistenceCookie("Expires") = PersistenceCookie.Expires.Ticks
    End If
    PersistenceCookie.Item(Field) = Value
    Response.Cookies.Add(PersistenceCookie)
End Sub

Cookie 値の取得

これらは、同じものの 2 つのわずかに異なるフレーバーです。 1 つ目は、Cookie が存在する場合はその値を返すか、空の文字列を返します。2 つ目は、Cookie の値が入力変数と等しい場合は単純なブール値を返します。

VB.NET

Public Shared Function PersistenceGet(Request As HttpRequest, CookieName As String, Field As String) As String
    Dim r As String = ""
    If Not IsNothing(Request.Cookies(CookieName)) Then
        If Not IsNothing(Request.Cookies(CookieName)(Field)) Then
            r = Request.Cookies(CookieName)(Field).ToString
        End If
    End If
    Return r
End Function
Public Shared Function PersistenceCheck(Request As HttpRequest, CookieName As String, Field As String, Value As String) As Boolean
    Dim r As Boolean = False
    If Not IsNothing(Request.Cookies(CookieName)) Then
        If Not IsNothing(Request.Cookies(CookieName)(Field)) Then
            If Request.Cookies(CookieName)(Field) = Value Then
                r = True
            End If
        End If
    End If
    Return r
End Function

クッキーのリサイクル

ちょっと待って!まだ前のビットで逃げないでください。ここで魔法が起こります。

頻繁に値をリセットしない限り、Cookie の有効期限が切れることがすぐにわかります。これは、特に永続 Cookie を記憶するために、リクエスト ハンドラーにプラグインされます。 20 分を下回ると、Cookie の有効期限がリセットされるだけです。

Public Shared Sub PersistenceRecycle(Request As HttpRequest, Response As HttpResponse, CookieName As String, Domain As String)
    If Not IsNothing(HttpContext.Current.Request.Cookies(CookieName)) Then
        Dim PersistenceCookie As HttpCookie = HttpContext.Current.Request.Cookies(CookieName)
        Dim Expires As Long = GetExpires(PersistenceCookie)
        Domain = UpdDomain(Domain)
        If Expires < DateAdd(DateInterval.Minute, 20, Now.ToUniversalTime()).Ticks Then
            PersistenceCookie.Expires = DateAdd(DateInterval.Minute, 20, Now.ToUniversalTime())
            PersistenceCookie("Expires") = PersistenceCookie.Expires.Ticks
            PersistenceCookie.Domain = Domain
            Response.Cookies.Add(PersistenceCookie)
        End If
    End If
End Sub

要約と使用法

関数の使用はこれ以上簡単ではありません。簡単な例として、次にユーザーが戻ってきたときにドロップダウン フィールドの選択値を設定することがあります。このシナリオでは、次のように使用します。

テストするために、単純なドロップダウンを使用して新しい Web フォームを作成し、変更時に自動ポストバックに設定してみましょう。

HMTL

<asp:dropdownlist runat="server" id="CookieDrop" AutoPostBack="true">
    <asp:ListItem Value="1">Value 1</asp:ListItem>
    <asp:ListItem Value="2">Value 2</asp:ListItem>
    <asp:ListItem Value="3">Value 3</asp:ListItem>
    <asp:ListItem Value="4">Value 4</asp:ListItem>
</asp:dropdownlist>

VB.NET

Imports CookieModule 'or whatever you called it
Public Class DropDownCookie
    Inherits System.Web.UI.Page
    Protected Sub CookieDrop_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CookieDrop.SelectedIndexChanged
        'Set the cookie for one minute...
        PersistenceSet(Request, Response, "DropDownTest", "", 1, "SelectedValue", CookieDrop.SelectedValue)
    End Sub
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        GetData()
        PersistenceRecycle(Request, Response, "DropDownTest", "")
        If Not IsPostBack Then 'Delete if you want to remove ViewState!
            SetDropDownVal()
        End If
    End Sub
    Protected Sub Page_PreRender() Handles Me.PreRender
    End Sub
    Protected Sub GetData()
        'Bind Data to DropDown
    End Sub
    Protected Sub SetDropDownVal()
        Dim DropDownVal As Integer
        If PersistenceGet(Request, "DropDownTest", "SelectedValue") <> "" Then
            If IsNumeric(PersistenceGet(Request, "DropDownTest", "SelectedValue")) Then
                DropDownVal = PersistenceGet(Request, "DropDownTest", "SelectedValue")
                Try
                    CookieDrop.SelectedValue = DropDownVal
                Catch
                End Try
            End If
        End If
    End Sub
End Class

著者

Was this helpful?

Please note, this commenting system is still in final testing.

Claytabaseによるウェブサイトのデザイン

これは、当社の Web サイト デザイン サービスの一部である、市場で最も高速で最適化されたシステムの 1 つである Ousia コンテンツ管理システム コードから変更されたコードのセクションです。

これらは、約£500から始まるサイトで利用できます.

詳細: レスポンシブで高速。コンテンツ管理システムを使用した Web 開発、設計、およびホスティング
Copyright Claytabase Ltd 2020

Registered in England and Wales 08985867

RSSLoginLink クッキーポリシーサイトマップ

Social Media

facebook.com/Claytabaseinstagram.com/claytabase/twitter.com/Claytabaselinkedin.com/company/claytabase-ltd

Get in Touch

+442392064871info@claytabase.comClaytabase Ltd, Unit 3d, Rink Road Industrial Estate, PO33 2LT, United Kingdom
The settings on this site are set to allow all cookies. These can be changed on our Cookie Policy & Settings page.
By continuing to use this site you agree to the use of cookies.
Ousia Logo
Logout
Ousia CMS Loader