1

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

我有一个 MVC4 Web 应用程序,我只是在 Visual Studio 2010 中对其进行调试,只是为了了解更多关于 Web 开发(尤其是 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 : 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; }
}

意见

    • 索引.cshtml

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

      指数

      @@ ViewBag.Result @@((string)Session["Test1"]) @Html.ActionLink("My session", "Index", "Mysession")

  • 我的会话

    • 索引.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>
    

    }

简而言之,这就像我的主应用程序一样,区别在于:在设置会话变量的 HTTPPOST 索引操作中的 MysessionController 中,我访问一个 XML 文件以查找某些内容。

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

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

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

4

1 回答 1

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/

于 2013-08-21T08:20:14.513 回答