我正在尝试将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();
}
任何想法?
答案 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。