Por lo general, todo lo que necesitará es llevar algún estado entre estas dos solicitudes. En realidad, hay una forma realmente funky de hacer esto que no se basa en JavaScript (piense en <noscript />).
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
Con esa cookie allí, puede en la siguiente solicitud para /redirect.html recuperar la información nombre = valor, puede almacenar cualquier tipo de información en esta cadena de par nombre / valor, hasta por ejemplo 4K de datos (límite de cookie típico). Por supuesto, debe evitar esto y almacenar códigos de estado y bits de bandera en su lugar.
Al recibir esta solicitud, a cambio, responde con una solicitud de eliminación para ese código de estado.
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
Mi HTTP está un poco oxidado. He estado revisando RFC2109 y RFC2965 para determinar qué tan confiable es realmente, preferiblemente me gustaría que la cookie se redondeara exactamente una vez, pero eso no parece ser posible, también, cookies de terceros. podría ser un problema para usted si se traslada a otro dominio. Esto todavía es posible, pero no tan fácil como cuando estás haciendo cosas dentro de tu propio dominio.
El problema aquí es la concurrencia, si un usuario avanzado está usando múltiples pestañas y logra intercalar un par de solicitudes que pertenecen a la misma sesión (esto es muy poco probable, pero no imposible), esto puede generar inconsistencias en su aplicación.
Es la forma <noscript /> de realizar viajes de ida y vuelta HTTP sin URL y JavaScript sin sentido
Proporciono este código como un concepto de concepto: si este código se ejecuta en un contexto con el que no está familiarizado, creo que puede averiguar qué parte es qué.
La idea es que llame a Relocate con algún estado cuando redirija, y la URL que reubicó llama a GetState para obtener los datos (si corresponde).
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;
}