Normalmente, tudo que você precisa é transportar algum estado entre essas duas solicitações. Na verdade, há uma maneira realmente divertida de fazer isso, que não depende de JavaScript (pense <noscript />).
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
Com esse cookie, é possível, na solicitação a seguir /redirect.html recuperar as informações name = value, você pode armazenar qualquer tipo de informação nessa cadeia de pares nome / valor, até 4K de dados (limite de cookie típico). Claro que você deve evitar isso e armazenar códigos de status e bits de sinalizador.
Ao receber esta solicitação, você responderá com uma solicitação de exclusão para esse código de status.
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
Meu HTTP está um pouco enferrujado. Estou analisando o RFC2109 e o RFC2965 para descobrir o quão confiável isso é, de preferência eu gostaria que o cookie retornasse exatamente uma vez, mas isso não parece ser possível, também, cookies de terceiros pode ser um problema para você se estiver se mudando para outro domínio. Isso ainda é possível, mas não tão indolor quanto quando você está fazendo coisas em seu próprio domínio.
O problema aqui é a simultaneidade, se um usuário avançado estiver usando várias guias e conseguir intercalar algumas solicitações pertencentes à mesma sessão (isso é muito improvável, mas não impossível), isso poderá levar a inconsistências no seu aplicativo.
É a maneira <noscript /> de fazer viagens de ida e volta por HTTP sem URLs sem sentido e JavaScript
Eu forneço esse código como um conceito profundo: se esse código é executado em um contexto que você não conhece, acho que pode descobrir qual parte é o quê.
A idéia é que você chame Relocate com algum estado ao redirecionar, e o URL que você relocou chama GetState para obter os dados (se houver).
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;
}