1

我正在尝试将 url 存储在 Session 中,以便稍后在我重定向响应以整理我的 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");
        }

    }

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

然后我尝试在我的 CMS/CMS 操作中提取它,但变量 url 为空??:

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

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

有任何想法吗?

4

2 回答 2

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 变量。:) 但是,无论出于何种原因,它确实有效。

于 2013-01-04T16:42:55.437 回答
1

抱歉,我不知道为什么会话不工作,但如果你想整理你的 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。

您还可以查看我借用代码的以下帖子。

于 2013-01-04T16:07:18.483 回答