hi我正在从客户端调用一个静态web方法
[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;
}
在我将代码上传到测试站点后,它运行得很好但在本地主机上,我有错误的行为有人能解释一下吗
我看到了问题,在第一个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;
}
请使用int.TryParse而不是int.Parse
if (HttpContext.Current.Session["counter"] != null)
{
int.TryParse(HttpContext.Current.Session["counter"].ToString(),counter);
counter++;
}