在 ASP.NET MVC 的单个请求生命周期中基于路由处理 cookie?
Handling cookies based on route in a single request lifecycle in ASP.NET MVC?
我正在编写一个路由,允许用户使用某些 JSON 对象的版本设置 cookie,应用程序将使用该对象来设置客户端配置。这是一个相当大的 JSON 对象,我们不想单独存储在 cookie 中。我们只想存储要查找的版本,并根据每个请求从云中的某个映射中设置,因为客户端的多个版本 运行 左右,我们希望在每个请求的基础上将它们分开。
目前,我知道问题是由于我对 ASP.NET MVC 的单个请求生命周期缺乏理解,我确信以下代码证明了这一点。我知道 Application_BeginRequest
操作可能在处理路由之前发生(如果我在这里错了请纠正我),但我不确定它应该发生在哪里以便在检索之前填充 cookie .我也不相信 Application_EndRequest
会因为相同但相反的问题而变得更好。
欢迎任何和所有有助于我理解生命周期的建议以及处理此类 cookie 值获取的适当操作!
// Working controller (cookie does get set, this is confirmed)
using System;
using System.Web;
using System.Web.Mvc;
using SMM.Web.Infrastructure.Filters;
namespace SMM.Web.Controllers
{
[NoCache]
public class SetCookieController : ApplicationController
{
private HttpCookie CreateVersionCookie(int versionId)
{
HttpCookie versionCookie = new HttpCookie("version_id");
versionCookie.Value = versionId.ToString();
return versionCookie;
}
public ActionResult SetCookie(int versionId)
{
Response.Cookies.Add(CreateVersionCookie(versionId));
return Redirect("/");
}
}
}
// In Global.asax.cs (this does not work to get the cookie)
private void LoadSomeJsonFromACookie()
{
HttpCookie someJsonThingCookie = HttpContext.Current.Request.Cookies["version_id"];
string jsonVersion = (string)staticVersionCookie.Value;
string json = FunctionToGetSomeJsonThingByVersion(jsonVersion); // This returns a stringified JSON object based on the jsonVersion supplied
dynamic someJsonThing = JsonConvert.DeserializeObject<dynamic>(json);
HttpContext.Current.Items["someJsonThing"] = someJsonThing;
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
RedirectToHttps();
// some other redirects happen here
LoadSomeJsonFromACookie();
}
Application_BeginRequest
是正确的地方。由于在代码中,您可以看到我正在将重定向发送回根 /
,它会在需要 cookie 之前设置 cookie。
我正在编写一个路由,允许用户使用某些 JSON 对象的版本设置 cookie,应用程序将使用该对象来设置客户端配置。这是一个相当大的 JSON 对象,我们不想单独存储在 cookie 中。我们只想存储要查找的版本,并根据每个请求从云中的某个映射中设置,因为客户端的多个版本 运行 左右,我们希望在每个请求的基础上将它们分开。
目前,我知道问题是由于我对 ASP.NET MVC 的单个请求生命周期缺乏理解,我确信以下代码证明了这一点。我知道 Application_BeginRequest
操作可能在处理路由之前发生(如果我在这里错了请纠正我),但我不确定它应该发生在哪里以便在检索之前填充 cookie .我也不相信 Application_EndRequest
会因为相同但相反的问题而变得更好。
欢迎任何和所有有助于我理解生命周期的建议以及处理此类 cookie 值获取的适当操作!
// Working controller (cookie does get set, this is confirmed)
using System;
using System.Web;
using System.Web.Mvc;
using SMM.Web.Infrastructure.Filters;
namespace SMM.Web.Controllers
{
[NoCache]
public class SetCookieController : ApplicationController
{
private HttpCookie CreateVersionCookie(int versionId)
{
HttpCookie versionCookie = new HttpCookie("version_id");
versionCookie.Value = versionId.ToString();
return versionCookie;
}
public ActionResult SetCookie(int versionId)
{
Response.Cookies.Add(CreateVersionCookie(versionId));
return Redirect("/");
}
}
}
// In Global.asax.cs (this does not work to get the cookie)
private void LoadSomeJsonFromACookie()
{
HttpCookie someJsonThingCookie = HttpContext.Current.Request.Cookies["version_id"];
string jsonVersion = (string)staticVersionCookie.Value;
string json = FunctionToGetSomeJsonThingByVersion(jsonVersion); // This returns a stringified JSON object based on the jsonVersion supplied
dynamic someJsonThing = JsonConvert.DeserializeObject<dynamic>(json);
HttpContext.Current.Items["someJsonThing"] = someJsonThing;
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
RedirectToHttps();
// some other redirects happen here
LoadSomeJsonFromACookie();
}
Application_BeginRequest
是正确的地方。由于在代码中,您可以看到我正在将重定向发送回根 /
,它会在需要 cookie 之前设置 cookie。