2013-09-06 2 views
-2

Я построил веб-сайт ASP.NET, который проводит онлайн-экзамен и отображает баллы. Я опубликовал его локально и разместил в IIS. Затем я подключил свою систему через lan с другим вопросом. Я ответил на первые 5 вопросов с моего ноутбука. И когда я попытался получить доступ к веб-сайту с другого ноутбука, он начинается с 5-го Вопроса вместо первого вопроса.Проблема с сеансом при размещении веб-сайта Asp.net в 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

При использовании static для переменной .NET зарезервирует место в памяти для этой переменной. Я думаю, что, когда новый пользователь пытается выполнить викторину, пока кто-либо еще, она будет ссылаться на то же самое местоположение переменной, которое имеет счет другого пользователя.

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

Итак, что может быть альтернативой этому сценарию? –

+1

Переменные Session и переменные 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, что позволит вам запомнить значения для нескольких запросов страниц за один сеанс.

Смежные вопросы