невозможно установить значение в сессию из статической функции в aspx.net

1

hi Я вызываю статический веб-метод со стороны клиента

[WebMethod(EnableSession = true)]
    public static CrmClientReturn check_CrmClient_Exists_With_CrmClient(string Email, string Password)
    {
                    int result = 0;

        try
        {
            result = CommonFunctions.CheckNumberOfEnters();

то я пытаюсь установить, сколько раз пользователь вызывает этот метод, но все время, когда я получаю значение Session для счетчика как null (даже после нескольких попыток), что я делаю неправильно?

public static int CheckNumberOfEnters()
{
    int result = 0;
    int counter = 0;
    DateTime TimeCounter;
    try
    {

        if (HttpContext.Current.Session["counter"] != null)
        {
            counter = int.Parse(HttpContext.Current.Session["counter"].ToString());
            counter++;
        }
        else
        {
            HttpContext.Current.Session.Add("counter", counter);
        }
        if (counter < int.Parse(ConfigurationManager.AppSettings["LoginTry"].ToString()) + 1)
        {
            result = 1;
            HttpContext.Current.Session["counter"] = counter;
        }
        else
        {
            if (counter < int.Parse(ConfigurationManager.AppSettings["LoginTry"].ToString()) + 4)
            {
                result = -1;
                HttpContext.Current.Session["counter"] = counter;
            }
            else
            {
                HttpContext.Current.Session["counter"] = counter;
                if (HttpContext.Current.Session["TimeCounter"] != null)
                {
                    TimeCounter = DateTime.Parse(HttpContext.Current.Session["TimeCounter"].ToString());
                }
                else
                {
                    HttpContext.Current.Session.Add("TimeCounter", DateTime.Now);
                    TimeCounter = DateTime.Now;
                }
                TimeSpan ts = DateTime.Now - TimeCounter;
                if (ts.TotalMinutes >= int.Parse(ConfigurationManager.AppSettings["LogINTryMinuts"].ToString()))
                {
                    HttpContext.Current.Session["TimeCounter"] = null;
                    result = 1;
                    counter = 0;
                    HttpContext.Current.Session["counter"] = counter;
                }
                else
                {
                    result = 0;
                }
            }
        }
    }
    catch (Exception ex)
    {
        ErrorLoging.InsertLogError("BasePage.aspx", "CheckNumberOfEnters fail", ex.ToString(), "", 0);
    }
    return result;
}

после того, как я загружу код на тестовый сайт, он работает отлично, но на локальном хосте я ошибаюсь, может кто-нибудь объяснить это?

  • 0
    Ваш код на стороне сервера не имеет состояния. Вам нужно использовать переменную сеанса.
  • 0
    @Donal Дональ Хэм, я не делаю свиноматку в функции CheckNumberOfEnters ??
Показать ещё 5 комментариев
Теги:
session
static

2 ответа

0

Используйте int.TryParse вместо int.Parse

if (HttpContext.Current.Session["counter"] != null)
{
     int.TryParse(HttpContext.Current.Session["counter"].ToString(),counter);
     counter++;
}
0

Я вижу проблему, после того, как вы увеличиваете счетчик в первом блоке if, вам нужно обновить переменную сеанса.

Измените это:

        if (HttpContext.Current.Session["counter"] != null)
        {
            counter = int.Parse(HttpContext.Current.Session["counter"].ToString());
            counter++;                 
        }

к этому:

        if (HttpContext.Current.Session["counter"] != null)
        {
            counter = int.Parse(HttpContext.Current.Session["counter"].ToString());
            counter++;
            HttpContext.Current.Session["counter"] = counter;
        }

Итак, CheckNumberOfEnters должен выглядеть так (я тестировал его и работает как ожидалось):

public static int CheckNumberOfEnters()
        {
            int result = 0;
            int counter = 0;
            DateTime TimeCounter;
            try
            {

                if (HttpContext.Current.Session["counter"] != null)
                {
                    counter = int.Parse(HttpContext.Current.Session["counter"].ToString());
                    counter++;
                    HttpContext.Current.Session["counter"] = counter;
                }
                else
                {
                    HttpContext.Current.Session.Add("counter", counter);
                }
                if (counter < int.Parse(ConfigurationManager.AppSettings["LoginTry"].ToString()) + 1)
                {
                    result = 1;
                    HttpContext.Current.Session["counter"] = counter;
                }
                else
                {
                    if (counter < int.Parse(ConfigurationManager.AppSettings["LoginTry"].ToString()) + 4)
                    {
                        result = -1;
                        HttpContext.Current.Session["counter"] = counter;
                    }
                    else
                    {
                        HttpContext.Current.Session["counter"] = counter;
                        if (HttpContext.Current.Session["TimeCounter"] != null)
                        {
                            TimeCounter = DateTime.Parse(HttpContext.Current.Session["TimeCounter"].ToString());
                        }
                        else
                        {
                            HttpContext.Current.Session.Add("TimeCounter", DateTime.Now);
                            TimeCounter = DateTime.Now;
                        }
                        TimeSpan ts = DateTime.Now - TimeCounter;
                        if (ts.TotalMinutes >= int.Parse(ConfigurationManager.AppSettings["LogINTryMinuts"].ToString()))
                        {
                            HttpContext.Current.Session["TimeCounter"] = null;
                            result = 1;
                            counter = 0;
                            HttpContext.Current.Session["counter"] = counter;
                        }
                        else
                        {
                            result = 0;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorLoging.InsertLogError("BasePage.aspx", "CheckNumberOfEnters fail", ex.ToString(), "", 0);
            }
            return result;
        }
  • 0
    если вы посмотрите на несколько строк вниз по дороге, вы увидите, что я установил значение счетчика
  • 0
    Я прошел через это в отладчике. Он входит в первый блок if и не входит в остальные. Вы пробовали изменения, которые я предложил?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню