0

真的在为 MVC / TempData / Session / 可能是 IIS6 类型的问题而苦苦挣扎。

我有一个简单的 MVC 网站 - 主控制器如下所示:

public class DemoController : Controller
{
    [HttpPost]
    public RedirectToRouteResult Index(SomeObject obj)
    {
        _someService.DoStuffWith(obj);

        TempData.Add("SomeObject", obj);

        return RedirectToAction("Index");
    }

    [HttpGet]
    public ViewResult Index()
    {
        var obj = TempData.Peek("SomeObject") as SomeObject;

        return View("Hello", obj);
    }
}

所以这是一个超级简单的 Post Redirect Get - 从某个地方提交数据,在 Post-friendly 操作中获取它,用它做一些事情,将它插入临时数据,重定向到 Get-friendly,再次拿起它,粘住用户在模型中的对象的新视图上。之前已经实现了十几次,从来没有出现过问题,但它一直在 IIS7 上。

在 cassini 和本地 IIS 7.5 上本地运行时,这完全符合预期。但是,一旦我部署到 Server 2003 和 IIS6,当我第一次尝试访问视图中“SomeObject”模型的任何属性时,我得到一个空引用异常。

那么,我还尝试了什么:

  • 我已经放弃了 TempData 并将其推入 Session["Whatever"] - 结果相同
  • 我已经推入 HttpContext.Current.Session["Whatever"] - 结果相同
  • 我已经推入 ControllerContext.HttpContext.Session["Whatever"] - 结果相同

(诚​​然,我对这些之间的差异很粗略 - 以前从来不需要担心它)

  • 我已确保在 IIS 上打开了会话状态。
  • 我检查了 Asp.net 会话标识符在请求之间没有变化。
  • 我已经部署到 2 个单独的服务器,都运行 2003 和 IIS6,两者的结果相同
  • 明确使用 SessionStateBehaviour.Required

我不能做的事情:

  • 在我的本地计算机之外部署到 IIS7
  • 使用 SqlServer 会话状态
  • 使用 StateServer SessionState

另外值得一提的是,该站点正在使用 MVC4 RC——尽管站点的这个特定部分没有使用 RC 功能。

欢迎任何想法或意见!

谢谢。

4

2 回答 2

1

这是我系统上的问题 - 我有一个包含下划线的服务器名称。RFC 952 不允许在主机名中使用下划线,这可能会干扰设置 cookie 并因此保持会话的能力。

为了追踪这一点,我开始观察每个控制器部分中的 SessionID,并注意到每篇文章都在变化。这只发生在我们的测试服务器上,因为我们用 _t 命名它以表明它是一台测试机器。哎哟!

我发现了这一点

这可能会提供其他价值。

我希望这有帮助

大卫

于 2012-08-16T18:47:22.610 回答
0

我的问题是我在 web.config 文件中有这个设置,但没有使用 SSL:

<httpCookies requireSSL="true" />

此设置可防止 cookie 在不安全(即非 SSL)连接上工作 - 包括 ASP.NET 会话 cookie。

于 2015-06-26T10:23:33.523 回答