通常,您所需要的只是在这两个请求之间携带一些状态。实际上有一种非常时髦的方法可以做到这一点,它不依赖于 JavaScript(想想 <noscript/>)。
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
有了那个 cookie,您可以在以下对 /redirect.html 的请求中检索 name=value 信息,您可以在这个 name/value 对字符串中存储任何类型的信息,最多可以说 4K 的数据(典型的 cookie 限制)。当然,您应该避免这种情况并改为存储状态代码和标志位。
收到此请求后,您会回复该状态代码的删除请求。
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
我的 HTTP 有点生疏我一直在通过 RFC2109 和 RFC2965 来确定这到底有多可靠,最好我希望 cookie 只往返一次,但这似乎也不可能,第三方 cookie如果您要迁移到另一个域,这对您来说可能是个问题。这仍然是可能的,但不像您在自己的域中做事那样轻松。
这里的问题是并发性,如果高级用户使用多个选项卡并设法交错属于同一会话的几个请求(这不太可能,但并非不可能),这可能会导致您的应用程序出现不一致。
这是在没有无意义的 URL 和 JavaScript 的情况下进行 HTTP 往返的 <noscript/> 方式
我提供此代码作为概念教授:如果此代码在您不熟悉的上下文中运行,我认为您可以弄清楚哪个部分是什么。
这个想法是您在重定向时调用 Relocate 并带有某种状态,并且您重新定位的 URL 调用 GetState 以获取数据(如果有)。
const string StateCookieName = "state";
static int StateCookieID;
protected void Relocate(string url, object state)
{
var key = "__" + StateCookieName + Interlocked
.Add(ref StateCookieID, 1).ToInvariantString();
var absoluteExpiration = DateTime.Now
.Add(new TimeSpan(120 * TimeSpan.TicksPerSecond));
Context.Cache.Insert(key, state, null, absoluteExpiration,
Cache.NoSlidingExpiration);
var path = Context.Response.ApplyAppPathModifier(url);
Context.Response.Cookies
.Add(new HttpCookie(StateCookieName, key)
{
Path = path,
Expires = absoluteExpiration
});
Context.Response.Redirect(path, false);
}
protected TData GetState<TData>()
where TData : class
{
var cookie = Context.Request.Cookies[StateCookieName];
if (cookie != null)
{
var key = cookie.Value;
if (key.IsNonEmpty())
{
var obj = Context.Cache.Remove(key);
Context.Response.Cookies
.Add(new HttpCookie(StateCookieName)
{
Path = cookie.Path,
Expires = new DateTime(1970, 1, 1)
});
return obj as TData;
}
}
return null;
}