经过一些良好测试后的大量更新
我有一个MVC4 Web应用程序,我只是在visual studio 2010中调试它,只是为了更多地了解webdevelopment(特别是MVC)。我现在正在玩Session。但是我不明白为什么在新的httprequest之后我丢失了变量。
就像这个问题:Losing my session variables
会话部分的web.config如下所示:
<sessionState mode="InProc"
cookieless="false"
timeout="20"/>
我的小测试项目可以解决问题,看起来很像:
控制器 - HomeController
public class HomeController : Controller
{
//
// GET: /Test/
public ActionResult Index()
{
string t = (string)Session["Test1"];
ViewBag.Result = t;
return View();
}
}
MysessionController
public class MysessionController:Controller { // // GET:/ Mysession /
public ActionResult Index()
{
return View(new Models.Mysession() {ID = Session.SessionID});
}
[HttpPost]
public ActionResult Index(Models.Mysession mySession) {
Session["Test1"] = "Bla";
return RedirectToAction("Index", "Home");
}
}
模型
public class Mysession {
[Required]
public string ID { get; set; }
}
浏览
主页
Index.cshtml
@ { ViewBag.Title =“索引”; }
@ @ ViewBag.Result @ @((字符串)会话[ “测试1”]) @ Html.ActionLink(“我的会话”,“索引”,“Mysession”)
MySession的
Index.cshtml
@model SessionTest.Models.Mysession @ { ViewBag.Title =“索引”; }
@using(Html.BeginForm()){
@Html.ValidationSummary(false)
<fieldset>
<legend>Mysession</legend>
<div class="editor-label">
@Html.LabelFor(model => model.ID)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ID)
</div>
<p>
<input type="submit" value="Log in" />
</p>
</fieldset>
}
这简直就像我的主要应用程序一样,DIFFERENCE是:在HTTPPOST Index操作中的MysessionController,其中设置了会话变量我访问XML文件以查找某些内容。
XML文件是我的持久存储,因为我没有SQL服务器。我的问题是,这会影响我的会话吗?
如果是这样,我想指出我访问XML文件PRIOR以在会话中设置变量。所以我觉得很奇怪。但我通过测试确定,如果我不访问XML文件,那么会话中的变量就可以了。如果我访问XML文件,则在RedirectToAction之后会话中的变量为空。
我不知道为什么我昨天没有得出这个结论。对不起大家。我昨天做了一些草率的测试。
答案 0 :(得分:8)
首先,我要感谢所有在这个问题上花时间的人。在我结识并最终进行了适当的测试之后,我确定了访问硬盘驱动器上的XML文件的问题。不知道昨天我搞砸了什么......
我在Google上发现了几篇关于在访问文件后丢失会话的帖子和文章。像这样:
Tessa Ferrandez的精彩案例研究。并且为了更小的范围: http://forums.asp.net/t/998370.aspx/1
和
http://blogs.msdn.com/b/toddca/archive/2005/12/01/499144.aspx
<强>结论强>
当您以任何方式访问网站的文件时,AppDomain将被刷新,这将刷新您的会话。
永远不要将您需要通过网站访问的文件放在“bin”文件夹中。我已将我的XML文件移动到App_Data,并且变量在Session中保持不变。
在我的博客上总结了我的答案:http://dannyvanderkraan.wordpress.com/2013/08/21/losing-session-variables-with-asp-net/