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;
}
после того, как я загружу код на тестовый сайт, он работает отлично, но на локальном хосте я ошибаюсь, может кто-нибудь объяснить это?
Используйте int.TryParse вместо int.Parse
if (HttpContext.Current.Session["counter"] != null)
{
int.TryParse(HttpContext.Current.Session["counter"].ToString(),counter);
counter++;
}
Я вижу проблему, после того, как вы увеличиваете счетчик в первом блоке 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;
}