1

私のプロジェクトには、次のコードを含む Global.asax ファイルがあります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Data.SqlClient;
using WrapperObjects;
using System.Security.Principal;

namespace Application
{
    public class Global : System.Web.HttpApplication
    {
        private string userLogin = string.Empty;
        void Application_Start(object sender, EventArgs e)
        {            

        }

        void Application_End(object sender, EventArgs e)
        {

        }

        void Application_Error(object sender, EventArgs e)
        {

        }

        void Session_Start(object sender, EventArgs e)
        {                               

        }

        void Session_End(object sender, EventArgs e)
        {
            DBUsers.SetUserStatusOnline("0", userLogin);   
            Session["curUserRole"] = string.Empty;
            Session["curUserLogin"] = string.Empty;
        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;
            if (app.Request.IsAuthenticated && User.Identity is FormsIdentity)
            {
                SqlConnection myConnection = new SqlConnection(DBConnection.GetConnectionString());
                SqlCommand myCommand = new SqlCommand("SELECT * FROM Users WHERE login=@login", myConnection);
                myCommand.Parameters.AddWithValue("login", app.Context.User.Identity.Name);
                myCommand.Connection.Open();
                SqlDataReader Reader = myCommand.ExecuteReader();
                string role = string.Empty;                
                while (Reader.Read())
                {
                    userLogin = Reader["login"].ToString();
                    role = Reader["role"].ToString();
                }
                if (role != string.Empty)
                {
                    FormsIdentity fi = (FormsIdentity)app.User.Identity;
                    app.Context.User = new GenericPrincipal(fi, new string[] { role });
                }
            }
        }
    }
}

ユーザーがプロジェクト実行機能にログインするprotected void Application_AuthenticateRequest(object sender, EventArgs e)と、ユーザーログインをプライベート文字列型userLogin変数に保存しようとします。しかしvoid Session_End(object sender, EventArgs e)、この関数でセッション終了関数を実行すると、ユーザーのログインステータス「オフライン」でデータベースに保存しようとしますが、変数userLoginは空です。ユーザーログインをすばやく保存して機能に入れることができる場所はどこvoid Session_End(object sender, EventArgs e)ですか?

4

1 に答える 1

1

Web アプリケーションはステートレスであるため、静的変数を使用してこれを行うことはできません。私があなたの場所にいる場合、ログインをセッション状態に保存します

 protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;
        if (app.Request.IsAuthenticated && User.Identity is FormsIdentity)
        {
            SqlConnection myConnection = new SqlConnection(DBConnection.GetConnectionString());
            SqlCommand myCommand = new SqlCommand("SELECT * FROM Users WHERE login=@login", myConnection);
            myCommand.Parameters.AddWithValue("login", app.Context.User.Identity.Name);
            myCommand.Connection.Open();
            SqlDataReader Reader = myCommand.ExecuteReader();
            var userLogin = string.Empty;
            string role = string.Empty;                
            while (Reader.Read())
            {
                userLogin = Reader["login"].ToString();
                role = Reader["role"].ToString();
            }
            if (role != string.Empty)
            {
                FormsIdentity fi = (FormsIdentity)app.User.Identity;
                app.Context.User = new GenericPrincipal(fi, new string[] { role });
                Session["UserLogin"] = userLogin;
            }
        }
    }
void Session_End(object sender, EventArgs e)
    {            
        if(Session["UserLogin"]!=null)
        {
            var userLogin = (string)Session["UserLogin"];
            DBUsers.SetUserStatusOnline("0", userLogin); 
        }              
    }
于 2012-08-02T06:52:31.370 に答える