0

Can I access session state from an HTTPModule? にある解決策に従ってください。、IHttpModule からセッション状態にアクセスできます。一部のファイルへのアクセスを制御するために使用しているため、誰かがアクセスできない場合は、ログイン ページにリダイレクトしたいと考えています。HttpContext.Current.Response.Redirect(page); を実行しようとすると Web サーバーがロックされます。したがって、私のポスト取得リクエスト状態関数は次のようになります...

 void Application_PostAcquireRequestState(object source, EventArgs e)
    {            
        HttpApplication app = (HttpApplication)source;

        MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;

        if (resourceHttpHandler != null)
        {
            // set the original handler back
            HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
        }

        HttpContext context = HttpContext.Current;
        string filePath = context.Request.FilePath;
        context.Trace.Write("HttpDownloadModule", "File path: " + filePath);

        Boolean hasAccess = true;

        if (filePath.Contains("content/downloads"))
        {
            //check to make sure a session has been established already....
            if (context.Session == null)
                hasAccess = false;

            SecurityBLL security = new SecurityBLL();
            string fileName = filePath.Split('/').Last();

            //check to see if a user is logged in
            if (!CitrixAccess.loggedin)
                hasAccess = false;

            //check access for download
            if (!security.checkSecurityByDownload(fileName))
                hasAccess = false;

            if (!hasAccess)
            {
                HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
                HttpContext.Current.Response.Redirect("../../login.aspx");
            }
        }

    }

何かご意見は?助けてくれてありがとう!

4

2 に答える 2

0

わかりましたので、回避策を見つけました... hasAccess 変数をグローバルに移動し、EndRequest ハンドラーを追加しました。だから私は EndRequest で hasAccess をチェックし、そこからリダイレクトを行っています。

于 2010-04-16T20:21:54.293 に答える
0

私の回答にはArthurdent510 の回答が含まれていますが、彼の回答についてコメントするだけの評判はありません。彼の答えは、私がどこに行かなければならないかを理解するのに大いに役立ちましたが、私にとっては完全ではありませんでした.

EndRequest ハンドラーに Response.Redirect 呼び出しを配置すると、無限ループが発生しました。これは、Response.Redirect によって EndRequest が呼び出されるためだと思います。そのため、EndRequest は永遠に何度も呼び出されていました。

これを回避するために、すでにリダイレクトを呼び出しているかどうかを示すプライベート ブール値を追加しました。既にリダイレクトを呼び出している場合は、Response.Redirect を再度呼び出すことはありません。これは、私の EndRequest メソッドがどのように見えるかです:

Private Sub Application_EndRequest(ByVal source As Object, ByVal e As EventArgs)
    If Not _blnHasAccess AndAlso Not _blnRedirected Then
        _blnRedirected = True
        HttpContext.Current.Response.Redirect("~/Error.aspx")
    End If
End Sub
于 2014-01-03T21:12:14.280 に答える