Zazwyczaj wszystko, czego kiedykolwiek potrzebujesz, to przenieść stan między tymi dwoma żądaniami. Jest naprawdę fajny sposób na zrobienie tego, który nie opiera się na JavaScript (pomyśl <noscript />).
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
Dzięki temu plikowi cookie możesz w następującym żądaniu do /redirect.html pobrać informacje nazwa = wartość, możesz przechowywać dowolny rodzaj informacji w ciągu tej pary nazwa / wartość, na przykład 4K danych (typowy limit plików cookie). Oczywiście należy tego unikać i zamiast tego przechowywać kody stanu i bity flagi.
Po otrzymaniu tego żądania w zamian odpowiedz na żądanie usunięcia tego kodu stanu.
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
Mój HTTP jest nieco zardzewiały. Przechodziłem przez RFC2109 i RFC2965, aby dowiedzieć się, jak naprawdę jest to wiarygodne, najlepiej chciałbym, aby ciasteczko dokładnie raz podróżowało, ale nie wydaje się to możliwe, również pliki cookie innych firm może być dla Ciebie problemem, jeśli przenosisz się do innej domeny. Jest to nadal możliwe, ale nie tak bezbolesne, jak w przypadku wykonywania czynności we własnej domenie.
Problemem jest współbieżność, jeśli zaawansowany użytkownik korzysta z wielu kart i przeplata kilka żądań należących do tej samej sesji (jest to bardzo mało prawdopodobne, ale nie niemożliwe), może to prowadzić do niespójności w aplikacji.
Jest to <noscript /> sposób robienia podróży w obie strony HTTP bez bezsensownych adresów URL i JavaScript
Podaję ten kod jako prof koncept: jeśli ten kod jest uruchamiany w kontekście, którego nie znasz, myślę, że możesz dowiedzieć się, co to za część.
Chodzi o to, że podczas przekierowania wywołujesz Relocate z pewnym stanem, a adres URL, który relokowałeś, wywołuje GetState w celu uzyskania danych (jeśli takie istnieją).
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;
}