无法在会话中存储来自全局的Url.asax文件

本文关键字:全局 Url asax 文件 会话 存储 | 更新日期: 2023-09-27 17:50:37

我试图将url存储在会话中,以便在我重定向响应以整理url时稍后拾取。这是在全球。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");
        }
    }

如果我查看Session内容它在那里

然后我尝试提取这个在我的CMS/CMS动作,但变量url是空的??:

    public ActionResult CMS(String aspxerrorpath)
    {
        var url = Session["requestUrl"]; // this is null??
        Response.StatusCode = 404;
        Response.TrySkipIisCustomErrors = true;
        return View();
    }

任何想法?

无法在会话中存储来自全局的Url.asax文件

Darin的方法更有意义,但如果其他人有同样的问题,需要在Session对象中设置一个值…

我不确定我明白发生了什么,但是,这是我发现的。如果已经设置了一个Session变量,那么代码就可以正常工作。例如,如果你有这样的内容:

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

点击一个页面,然后然后触发另一个请求的错误,然后Session[requestUrl]工作得很好。

这让我想到也许会话cookie不是由ASP发送的。. NET如果页面上有错误。当然,如果您在Application_Error函数中调用Server.ClearError();,那么Session[requestUrl]工作得很好,即使您还没有会话。啊哈,我想,绝对看起来像没有发送cookie,除非你先清除服务器错误。然而,然后我打开Fiddler,看到cookie 在两种情况下被发送。所以,我不知道为什么调用Server.ClearError();具有保存会话变量的效果。:)然而,不管出于什么原因,它确实有效。

对不起,我不知道为什么会话不工作,但如果你想整理你的url然后重写路径,不要重定向:

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。

您也可以查看下面的帖子,我从那里借用了代码。