In genere, tutto ciò che ti serve è portare uno stato tra queste due richieste. In realtà c'è un modo davvero stravagante per farlo che non si basa su JavaScript (pensa <noscript />).
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
Con quel cookie lì, puoi nella seguente richiesta a /redirect.html recuperare le informazioni nome = valore, puoi archiviare qualsiasi tipo di informazione in questa stringa coppia nome / valore, fino a dire 4K di dati (limite tipico del cookie). Ovviamente dovresti evitare questo e memorizzare invece codici di stato e bit di flag.
Dopo aver ricevuto questa richiesta, in cambio risponderai con una richiesta di eliminazione per quel codice di stato.
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
Il mio HTTP è un po 'arrugginito Ho provato RFC2109 e RFC2965 per capire quanto sia veramente affidabile, preferibilmente vorrei che il cookie facesse il viaggio di andata e ritorno esattamente una volta, ma ciò non sembra possibile, anche i cookie di terze parti potrebbe essere un problema per te se ti stai trasferendo in un altro dominio. Questo è ancora possibile ma non indolore come quando fai cose all'interno del tuo dominio.
Il problema qui è la concorrenza, se un utente esperto utilizza più schede e riesce a intercalare un paio di richieste appartenenti alla stessa sessione (questo è molto improbabile, ma non impossibile) ciò può portare a incoerenze nella tua applicazione.
È il modo <noscript /> di fare viaggi di andata e ritorno HTTP senza URL e JavaScript privi di significato
Fornisco questo codice come un concetto di concetto: se questo codice viene eseguito in un contesto che non hai familiarità, penso che tu possa capire quale parte è cosa.
L'idea è che al momento del reindirizzamento chiami Riposiziona con un certo stato e l'URL che hai ricollocato chiama GetState per ottenere i dati (se presenti).
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;
}