0

この方法で PostAuthenticateRequest にアタッチされた httpmodule でプライベート プロパティを宣言しました。

Private Property roles as New List(Of Integer)

次に、モジュールのさまざまなメソッドで、次のようにリストにロールを追加しました。

roles.Add(AppSettings.AnonymousRoleId)

しかし、奇妙な動作が発生しています...ページを更新するたびに、ページを更新するたびにプライベート プロパティの役割が記憶されている場合と同じように、常に同じ役割を追加するロール リストが長くなります。アプリケーションの静的変数と同じです。このプロパティはモジュールに対してプライベートであるべきではありませんか?

4

3 に答える 3

0

PostAuthenticateRequestイベントは、ページごとに何度も呼び出される場合があります。ここを見てくださいPostAuthenticateRequestは数回発生します

于 2012-12-25T12:49:47.907 に答える
0

OK、これについて他のテストを行ったところ、非常に奇妙な動作が発生しています....

モジュールが少なくとも1回読み込まれた場合、モジュール内の処理をスキップするフラグを実装しようとしました。このように HttpContext.Current.Items にフラグ var を配置するだけでこれを行いました。

       Private Sub Application_PostAuthenticateRequest(ByVal source As Object, ByVal e As EventArgs)
        ' A flag to prevent multiple execution on each request for static files like images, css, js
        If HttpContext.Current.Items("UserCheck") Is Nothing AndAlso _
        DirectCast(HttpContext.Current.Items("UserCheck"), String) <> "1" Then
            GlobalAppSettings.debug += 1

GlobalAppSettings.Debug は、httpmodules のデバッグ目的で使用する静的 (vb 共有) プロパティです。このコードを配置すると、ページが更新されるたびにデバッグ変数が +1 になるはずです (これは、Default.aspx の背後にあるコードの単純な Response.Write(GlobalAppSettings.debug) で確認します。これは、Application_PostAuthenticateRequest の最後にあるためです。メソッド HttpContext.Current.Items("UserCheck") = "1" を設定しました

では、各ページを更新するたびに GlobalAppSettings.debug 変数が 3 段階または 5 段階で増加するのはなぜでしょうか? 私を怒らせている

于 2012-12-25T19:19:14.687 に答える
0

わかりました、すべてのものに対する答えを見つけたと思います。HttpContext.Current.Items("UserCheck") のチェックは機能していませんでした。これは、jpg、css、js への各リクエストが独自の HttpContext を起動するため、そのようにグローバル フラグを使用する必要がないためです。

少し検索した後、はるかにクリーンで従来のソリューションを見つけました。静的コンテンツ リクエスト (ページに静的リソースを含む) でモジュールを起動させたくない場合は、セクションの Web 構成で設定する必要があります。

    <modules runAllManagedModulesForAllRequests="false">

また、モジュールに属性を追加する必要があります: precondition="managedHandler"。例:

    <add name="ReadUserSettings" type="namespace.to.type" preCondition="managedHandler" />

何らかの理由で、web.config にこれらの設定がありませんでした。今、私は別の小さな問題で立ち往生していますが、何が起こっているのかをよりよく理解したので、.axd ハンドラー (または WebResources.axd ハンドラーのみ) を除外する方法について、より具体的なトピックを開く必要があると思います.axd ハンドラーは preCondition="integratedMode,runtimeVersionv4.0" を持っているためコードを管理しているため、カスタム モジュールを起動することはできません。モジュールをそれまたは他の .axd から起動させたくないだけです。

于 2012-12-25T21:58:23.133 に答える