2013-09-06 1 views
-2

에 Asp.net 웹 사이트를 호스팅하는 동안은 온라인 시험을 실시하고 디스플레이 평가 점수 ASP.NET 웹 사이트를 만들었습니다. 로컬로 게시하고 IIS에서 호스팅했습니다. 그런 다음 다른 시스템과 lan을 통해 시스템을 연결했습니다. 내 노트북에서 처음 5 가지 질문에 답했습니다. 그리고 다른 랩톱에서 웹 사이트에 액세스하려고하면 첫 번째 질문 대신 5 번째 질문에서 시작됩니다.세션 문제 IIS

 public partial class MainPage : System.Web.UI.Page 
    { 
    public static int Qnum=1, Score=0,Count=0; 
    public static List<int> answered=new List<int>(); 
    private SQLconnect sqlconnect = new SQLconnect(); 


    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      Session["Score"] = Score; 
      fnMCq(); 
     } 
    } 

    public void fnMCq() 
    { 
     try 
     { 
      DataTable dt = new DataTable(); 
      sqlconnect.Connection_string = System.Configuration.ConfigurationManager.AppSettings["conn_MCQ"]; 

      string query = "select * from Questions where qid='" + Qnum + "'"; 
      dt = sqlconnect.getDataTable(query); 
      string[] array = dt 
        .AsEnumerable() 
        .Select(row => row.Field<string>("question")) 
        .ToArray(); 
      Question.Text = array[0]; 
      query = "Select * from Answers where qid='" + Qnum + "'"; 
      dt.Clear(); 
      dt = sqlconnect.getDataTable(query); 
      Dictionary<string, string> values = new Dictionary<string, string>(); 
      values.Add(dt.Rows[0][1].ToString(), "1"); 
      values.Add(dt.Rows[0][2].ToString(), "2"); 
      values.Add(dt.Rows[0][3].ToString(), "3"); 
      values.Add(dt.Rows[0][4].ToString(), "4"); 
      Answers.DataSource = values; 
      Answers.DataTextField = "key"; 
      Answers.DataValueField = "Value"; 
      Answers.DataBind(); 
      fnHideSubmit(); 
      if (Qnum == 1) 

       btnPrevious.Enabled = false; 
      else 
       btnPrevious.Enabled = true; 
      if (Qnum == 20) 
       btnNext.Enabled = false; 
      else 
       btnNext.Enabled = true; 

     } 
     catch (Exception e) 
     { 
      Session["error"] = e.Message; 
      Response.Redirect("ErrorPage.aspx"); 

     } 

    } 

    protected void btnPrevious_Click(object sender, EventArgs e) 
    { 
     if (!isexamover()) 
     { 
      Qnum = Qnum - 1; 
      fnMCq(); 
     } 
    } 

    protected void btnNext_Click(object sender, EventArgs e) 
    { 
     if (!isexamover()) 
     { 
      Qnum = Qnum + 1; 
      fnMCq(); 
     } 
    } 

    public void fnUpdateScore() 
    { 
     SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["conn_MCQ"]); 

     int selectedanswer,answer; 
     selectedanswer=Convert.ToInt32(Answers.SelectedValue); 
     string query = "select answer from questions where qid='"+Qnum+"'"; 
     SqlCommand cmd=new SqlCommand(query,conn); 
     conn.Open(); 
     sqlconnect.Connection_string = System.Configuration.ConfigurationManager.AppSettings["conn_MCQ"]; 

      answer =Convert.ToInt32(cmd.ExecuteScalar().ToString()) ; 
      if (answer == selectedanswer) 
      { 
       Score = Score + 1; 
       Session["Score"] = Score; 
      } 
    } 

    protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     answered.Add(Qnum); 
     fnHideSubmit(); 
     fnUpdateScore(); 
     if (!qbound()) 
     { 
      if (!isexamover()) 
      { 
       ++Qnum; 
       fnMCq(); 
      } 
      else 
      { 
       Session["Score"] = Score; 
       Response.Redirect("ScoreDisplay.aspx"); 
      } 

     } 

    } 
    public void fnHideSubmit() 
    { 
     foreach (int i in answered) 
     { 
      if (i == Qnum) 
      { 
       btnSubmit.Enabled = false; 
       break; 
      } 
      else 
       btnSubmit.Enabled = true; 
     } 
    } 
    public bool qbound() 
    { 
     if (Qnum == 1 || Qnum == 20) 
      return true; 
     else 
      return false; 

    } 
    public bool isexamover() 
    { 
     if (answered.Count == 20) 
     { 
      Session["Score"] = Score; 
      Response.Redirect("ScoreDisplay.aspx"); 
      return true; 
     } 

     return false; 

    } 
+0

귀하의 질문은 명확하지 않다 !!!!! –

+0

문제를 더 잘 설명 할 수있는 코드를 추가하십시오. – paqogomez

+0

나는 결코 설치 어떤 세션 @Hanlet .... 내가 세션이 자동으로 생성됩니다 때마다 요청이 서버로 전송됩니다 믿습니다. 그렇지 않니? –

답변

0

변수에 고정하여, .NET은 그 변수에 대해 메모리에 자리를 확보한다. 나는 새로운 사용자가 퀴즈를 할 때 다른 사람이, 그것은 다른 사용자의 수를 가지고 같은 변수 위치를 참조 할 때 생각하고있다.

public int Qnum=1, Score=0,Count=0; 
public List<int> answered=new List<int>(); 
+0

그럼이 시나리오의 대안이 될 수 있을까요? –

+1

세션 변수 및 PageState 변수는 사용자에게 고유합니다. 따라서 Session 변수는 "Session_End"전역 메소드가 호출되고 PageState가 PostBacks를 통해 데이터를 보존 할 때까지 데이터를 보존합니다. – Manazu5351

+0

'Session_End'를 호출 할 수 없다는 점에 유의하십시오. 세션에 깔끔하게 닫히는 것에 의존하는 무언가를 호출하지 마십시오. –

1

당신이 가진 문제는 정적 필드에 모든 것을 저장에서 온다 :

public static int Qnum=1, Score=0,Count=0; 
public static List<int> answered=new List<int>(); 

이 이러한 필드 중 하나의 인스턴스 만이 있음을 의미한다. 이 필드는 해당 클래스의 특정 인스턴스가 아닌 클래스에 연결됩니다.

이 문제를 해결하기 위해, 당신은 당신이 하나의 세션 내에서 여러 페이지 요청에서 값을 기억 할 수있는의 Session 이러한 저장할 수 있습니다.