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

Dan*_*aan 1 asp.net-mvc session asp.net-mvc-4

经过一些好的测试后,BIG更新

我有一个MVC4 Web应用程序,我只是在visual studio 2010中调试它,只是为了更多地了解webdevelopment(特别是MVC).我现在正在玩Session.但是我不明白为什么在新的httprequest之后我丢失了变量.

就像这个问题:丢失我的会话变量

我对会话部分的web.config看起来像:

<sessionState mode="InProc"
   cookieless="false"
   timeout="20"/>
Run Code Online (Sandbox Code Playgroud)

我的小测试项目隔离问题工作正常,看起来像:

控制器 - HomeController

public class HomeController : Controller
{
    //
    // GET: /Test/

    public ActionResult Index()
    {
        string t = (string)Session["Test1"];
        ViewBag.Result = t;
        return View();
    }

}
Run Code Online (Sandbox Code Playgroud)
  • 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");
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

楷模

public class Mysession {
    [Required]
    public string ID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

查看

    • Index.cshtml

      @ {ViewBag.Title ="索引"; }

      指数

      @@ ViewBag.Result @ @((string)Session ["Test1"])@ Html.ActionLink("我的会话","索引","Mysession")

  • MySession的

    • Index.cshtml

      @model SessionTest.Models.Mysession @ {ViewBag.Title ="Index"; }

    指数

    @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>
    
    Run Code Online (Sandbox Code Playgroud)

    }

这看起来像我的主要应用程序,DIFFERENCE是:在HTTPPOST索引操作中的MysessionController,其中设置了会话变量我访问XML文件以查找某些内容.

XML文件是我的持久存储,因为我没有SQL服务器.我的问题是,这会影响我的会话吗?

如果是这样,我想指出我访问XML文件PRIOR以在会话中设置变量.所以我觉得很奇怪.但我通过测试确定,如果我不访问XML文件,那么会话中的变量就可以了.如果我访问XML文件,则在RedirectToAction之后会话中的vars为null.

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

Dan*_*aan 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/