c#写入Session会丢失嘛?为什么偶尔会出现验证码不对?



protected void Page_Load(object sender, EventArgs e)
        {
            string checkCode = GetRandomCode(4);
            HttpContext.Current.Session["CheckCodeKF"] = checkCode;
            SetPageNoCache();
            CreateImage(checkCode);
        }
private void SetPageNoCache()
        {
            HttpContext.Current.Response.Buffer = true;
            HttpContext.Current.Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
            HttpContext.Current.Response.Expires = 0;
            HttpContext.Current.Response.CacheControl = "no-cache";
            HttpContext.Current.Response.AppendHeader("Pragma", "No-Cache");
        }
private void CreateImage(string checkCode){这个是把获取到的写入到画板内然后返还给前台。}



//执行登陆事件
string yzm = Request.Form["checkword"];
                        if (Session["CheckCodeKF"] != null)
                        {
                            if (Session["CheckCodeKF"].ToString().ToLower() == yzm.ToLower())
                            {
//登陆代码
                             }
                            else
                            {
                                Response.Write("checkerror");
                            }
                        }
                        else
                        {
                            Response.Write("lost");
                        }


偶尔会出现Session["CheckCodeKF"] ==null   这是为什么吖?只是第一次打开页面的时候偶尔出现。该怎么改?

14 个解决方案

#1


这个session时间是多长?你是不是有做loadbalance,但访问链接没能保持长连接?或者你的sessionmodel设置的是不是inproc?

#2


引用 1 楼 starfd 的回复:
这个session时间是多长?你是不是有做loadbalance,但访问链接没能保持长连接?或者你的sessionmodel设置的是不是inproc?

没有设置时长、然后试了试还是会出现获取不到的那个错误。后面的俩问题不是特别懂

#3


引用 2 楼 qwe564217192 的回复:
]


刚刚设置了五分钟的时长在本地调试了下还是会获取不到。

protected void Page_Load(object sender, EventArgs e)
        {
            string checkCode = GetRandomCode(4);
            HttpContext.Current.Session["CheckCodeKF"] = checkCode;
            HttpContext.Current.Session.Timeout = 5;
            SetPageNoCache();
            CreateImage(checkCode);
        }


其他的没动。

#4


web.config里面的session那段配置里面,或者你就找下整个web.config,有没有InProc,如果是InProc,你改配置,修改dll,重新生成都会导致session丢失

#5


引用 4 楼 starfd 的回复:
web.config里面的session那段配置里面,或者你就找下整个web.config,有没有InProc,如果是InProc,你改配置,修改dll,重新生成都会导致session丢失


在web.config里面搜了一下,搜不到关键字session或者InProc,两个都为空。这该怎么弄。貌似web.config除了修改个SQL链接字符串还有添加了几个变量、其他的都没动。

#7


引用 6 楼 starfd 的回复:
没有的话就是inproc了
http://www.cnblogs.com/lykbk/archive/2013/01/13/hf576856868.html


这是web.config里面的代码

<system.web>
    <sessionState mode="InProc" cookieless="false" timeout="5" />
    <compilation debug="true" targetFramework="4.0"/>
    <httpRuntime maxQueryStringLength="2097151" executionTimeout="300"/>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880"/>
    </authentication>
    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/"/>
      </providers>
    </membership>
    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
    </profile>
    <roleManager enabled="false">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/"/>
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/"/>
      </providers>
    </roleManager>
    <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
  </system.web>


添加进去
<sessionState mode="InProc" cookieless="false" timeout="5" />
也不管用、Session["CheckCodeKF"]这个获取的还是个null

我百度了看别的地方说还需要改IIS?用改嘛?

#8


默认是InProc,你改成StateServer呢……

#9


引用 8 楼 starfd 的回复:
默认是InProc,你改成StateServer呢……



tcpip=myserver:42424这个端口怎么设置?我在本机上调试,设置为localhost或者127.0.0.1为服务器名称了。而且注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection 的值也改为0了、但是还会出现没写进去的情况。

#10


引用 8 楼 starfd 的回复:
默认是InProc,你改成StateServer呢……

页面的错误为
无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection 的值,确保服务器接受远程请求。如果服务器位于本地计算机上,并且上面提到的注册表值不存在或者设置为 0,则状态服务器连接字符串必须使用“localhost”或“127.0.0.1”作为服务器名称。

web.config里面的代码为
<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:13580"  cookieless="false" timeout="5" />

#11


在控制面板--管理工具--服务里面找到ASP.NET状态服务,开启就可以了

#12


引用 11 楼 starfd 的回复:
在控制面板--管理工具--服务里面找到ASP.NET状态服务,开启就可以了


还是不行、打开了也不行、首次打开页面然后输入账号密码验证码点击登录后还是会出现那种获取不到的情况

#13


那就不知道了,要么还有种可能你们自定义了session策略……

#14


引用 13 楼 starfd 的回复:
那就不知道了,要么还有种可能你们自定义了session策略……


好像是默认的、没有修改session的东西,就最初的那段代码,加载登录页的时候验证码的那个img标签的地址是一个aspx页面的路径,然后在aspx页面的cs文件里写的上面代码的那个方法,先获取随机值,然后写入session然后设置不缓存页面,然后写入到画板内然后返给登陆页,然后用户输入完账号密码验证码点击登录后调用登录接口,在接口内先判断session是否为空,若为空则返回一个值前台提示验证码过期,就这么一个逻辑,然后现在就是会在用户首次加载登陆页的时候获取不到session,还是偶尔,其他的什么也没有动,全是原装的。现在找不到出错在哪了
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告