我正在使用会话值来识别用户选择的语言。 LoadMultilingual()是我将调用所有页面为label分配值的方法。 我意识到会话值不会长时间存储值,默认情况下存储20分钟,因此当用户单击任何将重新加载多语言功能的按钮时,它将提示错误。
我将会话值的时间设置为60分钟,当我尝试在45分钟左右点击一个按钮时,它会把这个值告诉我。
以下代码是我如何声明会话超时
<sessionState
mode="InProc"
cookieless="true"
timeout="60" />
以下代码是用户在登录页面选择首选语言的代码形式C#。
protected void Page_Load(object sender, EventArgs e)
{
Session["index"] = null;
Session["counter"] = null;
Session["LoginMsg"] = null;
if (Session["Lang"] == null)
{
Session["Lang"] = Request.UserLanguages[0];
}
if (Session["login"] == null)
{
Session["login"] = 1;
}
if (!IsPostBack)
{
LoadMultilingual();
if ((String)Session["Lang"] == "zh-TW")
{
ddLang.SelectedIndex = 1;
}
else
{
ddLang.SelectedIndex = 0;
}
}
Session["stop"] = null;
}
protected void ddLang_SelectedIndexChanged(object sender, EventArgs e)
{
Session["Lang"] = ddLang.SelectedValue;
LoadMultilingual();
}
以下代码是C#中使用多语言会话的代码。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DisableLinkBtn();
LoadMultilingual();
}
}
private void LoadMultilingual()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(Session["Lang"].ToString());
rm = new ResourceManager("SOMaintenance.App_GlobalResources.Lang", Assembly.GetExecutingAssembly());
ci = Thread.CurrentThread.CurrentCulture;
Site1 site = this.Master as Site1;
if (site != null)
{
Label SensorTemperatureLabel = site.FindControl("label1") as Label;
string header = validate.getError("userheader", (String)Session["Lang"]);
SensorTemperatureLabel.Text = header;
}
if ((String)Session["Lang"] == "zh-TW")
{
GridView1.Columns[0].HeaderText = "用户账号";
GridView1.Columns[1].HeaderText = "用户名称";
GridView1.Columns[2].HeaderText = "用户职位";
}
btnAdd.Attributes.Add("title", rm.GetString("btnAdd", ci));
btnSearch.Attributes.Add("title", rm.GetString("btnSearch", ci));
}
任何人都知道它为什么不起作用?我的代码工作在40分钟内完美找到,事情是我已经将会话超时设置为60分钟。 该错误指向会话[&#34; Lang&#34;]此值。 (它只出现在大约45分钟后,我尝试了25分钟就可以了)
答案 0 :(得分:0)
如果有人在您初始化Session["Lang"]
之前访问该页面,那么他们将获得空引用异常。所以你需要初始化它。最好的方法是在全局应用程序类(global.asax)的Session_Start事件中。
protected void Session_Start(object sender, EventArgs e)
{
Session["Lang"] = //add your code here to figure out the language
}
通过在会话开始时初始化它,您可以确保始终初始化变量(除非您稍后将其设置为null)。
此外,您还启用了cookieless身份验证。不要那样做!这是非常不安全的,因为敏感数据现在将存储在URL中..
答案 1 :(得分:0)
测试了所有方法三天。我找到了解决方案。 对于那些在asp.net中扩展Session的人可以使用这种方法。
第1步 - 在web.config
设置会话超时将以下代码复制并粘贴到web.config
<authentication mode="Forms">
<forms timeout="60"/>
</authentication>
<sessionState
mode="InProc"
cookieless="true"
timeout="60" />
请注意,默认会话值仅持续 20分钟,如上面的代码,我已将其设置为 60分钟。
第2步 - 配置IIS
如果将Web应用程序发布到IIS,请转到IIS管理器。
开始 - &gt; IIS管理器 - &gt;网站 - &gt;默认网站 - &gt; ASP 强> (如果你没有为你的网络应用程序创建一个新的,否则只需点击你用于你的网络应用程序的那个)
然后找到会话属性 - &gt;超时将其设置为 01:00:00 ,这意味着60分钟。
默认情况下,您应该看到00:20:00
然后点击右侧的应用。 示例屏幕如下
完成上述步骤后,你可以笑你的网络应用程序,然后解决问题!!!
祝你有个愉快的一天,并希望它有所帮助!