आमतौर पर, आपको इन दोनों अनुरोधों के बीच किसी न किसी राज्य को ले जाने की आवश्यकता होगी। ऐसा करने के लिए वास्तव में एक बहुत ही मजेदार तरीका है जो जावास्क्रिप्ट पर निर्भर नहीं करता है (विचार करें <noscript />)।
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
उस कुकी के साथ, आप निम्नलिखित में अनुरोध कर सकते हैं /redirect.html नाम = मान की जानकारी पुनः प्राप्त करें, आप इस नाम / मूल्य जोड़ी स्ट्रिंग में किसी भी प्रकार की जानकारी संग्रहीत कर सकते हैं, डेटा का 4K (विशिष्ट कुकी सीमा) कहने के लिए। बेशक आपको इससे बचना चाहिए और इसके बजाय स्टेटस कोड और फ्लैग बिट्स को स्टोर करना चाहिए।
इस अनुरोध को प्राप्त करने के बाद, आप उस स्थिति कोड के लिए अनुरोध हटाएं।
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
मेरा HTTP थोड़ा कठोर है, मैं यह जानने के लिए RFC2109 और RFC2965 को गर्त में ले जा रहा हूं कि यह वास्तव में कितना विश्वसनीय है, अधिमानतः मैं चाहता हूं कि कुकी राउंड ट्रिप बिल्कुल एक बार हो, लेकिन यह संभव नहीं लगता है, भी, तीसरे पक्ष के कुकीज़ यदि आप किसी अन्य डोमेन पर स्थानांतरण कर रहे हैं तो आपके लिए यह समस्या हो सकती है। यह तब भी संभव है, लेकिन जब तक आप अपने स्वयं के डोमेन के भीतर सामान नहीं कर रहे हों, तब तक यह संभव नहीं है।
यहाँ समस्या समसामयिक है, यदि कोई पॉवर उपयोगकर्ता एक से अधिक टैब का उपयोग कर रहा है और एक ही सत्र से संबंधित कुछ अनुरोधों को हल करने का प्रबंधन करता है (यह बहुत संभावना नहीं है, लेकिन असंभव नहीं है) तो इससे आपके आवेदन में असंगति हो सकती है।
यह व्यर्थ यूआरएल और जावास्क्रिप्ट के बिना HTTP दौर यात्राएं करने का <noscript /> तरीका है
मैं इस कोड को अवधारणा के रूप में प्रदान करता हूं: यदि यह कोड इस संदर्भ में चलाया जाता है कि आप परिचित नहीं हैं तो मुझे लगता है कि आप यह जान सकते हैं कि कौन सा भाग क्या है।
विचार यह है कि जब आप रीडायरेक्ट करते हैं, तो आप कुछ स्थिति के साथ रिलोकेट को कॉल करते हैं, और जिस 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;
}