MVC4会话不会在请求之间保持不变

时间:2013-08-20 14:11:45

标签: asp.net-mvc session asp.net-mvc-4

经过一些良好测试后的大量更新

我有一个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之后会话中的变量为空。

我不知道为什么我昨天没有得出这个结论。对不起大家。我昨天做了一些草率的测试。

1 个答案:

答案 0 :(得分:8)

首先,我要感谢所有在这个问题上花时间的人。在我结识并最终进行了适当的测试之后,我确定了访问硬盘驱动器上的XML文件的问题。不知道昨天我搞砸了什么......

我在Google上发现了几篇关于在访问文件后丢失会话的帖子和文章。像这样:

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx

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/