无法在Global.asax文件的会话中存储Url

时间:2013-01-04 16:00:16

标签: c# asp.net-mvc-3 asp.net-mvc-4

我正在尝试将URL存储在Session中,以便稍后在我重定向Response以整理我的URL时将其拾取。这是在Global.asax文件中。我正在采取原始响应并将URL存储在会话中

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        HttpException httpException = exception as HttpException;

        // get the url
        var url = Request.RawUrl;

        // store in session
        Session["requestUrl"] = url;

        if (exception is HttpException && ((HttpException)exception).GetHttpCode() == 404) {
            Response.Redirect("/CMS/CMS");
        }

    }

如果我查看会话内容,那就在那里

然后我尝试在CMS / CMS Action中提取它,但变量url为null ??:

    public ActionResult CMS(String aspxerrorpath)
    {
        var url = Session["requestUrl"]; // this is null??

        Response.StatusCode = 404;
        Response.TrySkipIisCustomErrors = true;
        return View();
    }

任何想法?

2 个答案:

答案 0 :(得分:2)

Darin的方法更有意义,但万一有其他人遇到同样的问题而需要在Session对象中设置一个值...

我不确定我理解发生了什么,但是,这就是我发现的。如果已经设置了Session变量,那么您所拥有的代码就可以正常工作。所以,例如,如果你有这样的东西:

protected void Session_Start(object sender, EventArgs e) {
 Session["asdasd"] = true;
}

然后你点击一个页面,然后你在另一个请求上触发了错误,那么Session[requestUrl]就可以了。

这让我觉得如果页面上有错误,ASP.NET可能没有发送会话cookie。当然,如果您在Server.ClearError();功能中拨打Application_Error,那么即使您还没有会话,Session[requestUrl]也能正常工作。啊哈,我想,除非你先清除服务器错误,否则看起来好像没有发送cookie。然而,然后我爆发了Fiddler,并且看到在这两种情况下都发送了一个cookie 。所以,我不知道为什么调用Server.ClearError();具有保存Session变量的效果。 :)然而,无论出于什么原因它确实有效。

答案 1 :(得分:1)

抱歉,我不知道为什么会话无法正常工作,但如果您想整理您的网址,请重写路径,不要重定向:

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;

    if (exception is HttpException && ((HttpException)exception).GetHttpCode() == 404) 
    {
        Server.ClearError();

        // get the url
        var url = Request.RawUrl;

        var routeData = new RouteData();
        routeData.Values["controller"] = "Cms";
        routeData.Values["action"] = "Cms";
        routeData.Values["aspxerrorpath"] = url;

        IController cmsController = new CmsController();
        var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
        cmsController.Execute(rc);
    }
}

这样您就不需要执行额外的重定向,也不需要依赖Session。

您也可以从我借用代码的位置结帐following post