उत्तर। पोस्ट के बजाय पोस्ट के साथ अप्रत्यक्ष?


248

हमें फ़ॉर्म जमा करने और कुछ डेटा सहेजने की आवश्यकता होती है, फिर उपयोगकर्ता को एक पृष्ठ ऑफ़साइट पर पुनर्निर्देशित करते हैं, लेकिन पुनर्निर्देशन में, हमें GST नहीं, बल्कि POST के साथ एक फ़ॉर्म सबमिट करना होगा।

मैं उम्मीद कर रहा था कि इसे पूरा करने का एक आसान तरीका है, लेकिन मुझे लगता है कि ऐसा नहीं है। मुझे लगता है कि मुझे अब एक साधारण अन्य पेज बनाना होगा, जिस रूप में मैं चाहता हूं, उस पर पुनर्निर्देशित करें, प्रपत्र चर को पॉप्युलेट करें, फिर एक body.onload कॉल को एक स्क्रिप्ट पर करें जो केवल document.forms [0] .submit कहता है। );

अगर कोई विकल्प हो तो क्या कोई मुझे बता सकता है? हमें इस परियोजना में बाद में इसे मोड़ने की आवश्यकता हो सकती है, और यह जटिल हो सकता है, इसलिए यदि एक आसान था तो हम यह कर सकते हैं कि यह सभी गैर-अन्य पृष्ठ निर्भर करता है जो शानदार होगा।

वैसे भी, किसी भी और सभी प्रतिक्रियाओं के लिए धन्यवाद।


PHP में, आप cURL के साथ POST डेटा भेज सकते हैं। क्या .NET के लिए कुछ तुलनीय है?
ब्रायन वॉरशॉ

मुझे लगता है कि यह आसान उत्तर है जिसकी आपको तलाश थी। मैं विश्वास नहीं कर सकता कि यह कितना सरल है ... stackoverflow.com/a/6062248/110549
जोकूल

@BrianWarshaw मुझे System.Net.Http.HttpClient msdn.microsoft.com/en-us/library/… बहुत ही सहज और प्रयोग करने में तेज़ लगता है।
स्टॉयन डिमोव

जवाबों:


228

ऐसा करने के लिए यह समझना आवश्यक है कि HTTP कैसे काम करता है। जब आप उपयोग करते हैं Response.Redirect(), तो आप HTTP स्थिति कोड 302 के साथ एक प्रतिक्रिया (अनुरोध करने वाले ब्राउज़र पर) भेजते हैं , जो ब्राउज़र को बताता है कि आगे कहां जाना है। परिभाषा के अनुसार, ब्राउज़र एक GETअनुरोध के माध्यम से बना देगा , भले ही मूल अनुरोध ए POST

एक अन्य विकल्प HTTP स्थिति कोड 307 का उपयोग करना है , जो निर्दिष्ट करता है कि ब्राउज़र को मूल अनुरोध के समान रीडायरेक्ट अनुरोध करना चाहिए, लेकिन उपयोगकर्ता को सुरक्षा चेतावनी के साथ संकेत देने के लिए। ऐसा करने के लिए, आप कुछ इस तरह से लिखेंगे:

public void PageLoad(object sender, EventArgs e)
{
    // Process the post on your side   

    Response.Status = "307 Temporary Redirect";
    Response.AddHeader("Location", "http://example.com/page/to/post.to");
}

दुर्भाग्य से, यह हमेशा काम नहीं करेगा। विभिन्न ब्राउज़र इसे अलग तरीके से लागू करते हैं , क्योंकि यह एक सामान्य स्थिति कोड नहीं है।

ओपेरा, ओपेरा और फायरफॉक्स डेवलपर्स के विपरीत, आईई डेवलपर्स ने कभी कल्पना नहीं पढ़ी है, और यहां तक ​​कि नवीनतम, सबसे सुरक्षित IE7 किसी भी चेतावनियों या पुष्टि संवादों के बिना डोमेन ए से डोमेन बी के लिए पोस्ट अनुरोध को पुनर्निर्देशित करेगा! सफारी भी एक दिलचस्प तरीके से कार्य करता है, जबकि यह एक पुष्टिकरण संवाद नहीं बढ़ाता है और रीडायरेक्ट करता है, यह POST डेटा को दूर फेंक देता है, प्रभावी रूप से 307 रीडायरेक्ट को और अधिक सामान्य 302 में बदल देता है।

इसलिए, जहां तक ​​मुझे पता है, कुछ इस तरह से लागू करने का एकमात्र तरीका जावास्क्रिप्ट का उपयोग करना होगा। दो विकल्प हैं जो मैं अपने सिर के ऊपर से सोच सकता हूं:

  1. फ़ॉर्म बनाएं और उसके actionविशेषता बिंदु को तृतीय-पक्ष सर्वर पर रखें। फिर, सबमिट बटन पर एक क्लिक ईवेंट जोड़ें जो पहले डेटा के साथ आपके सर्वर के लिए एक AJAX अनुरोध को निष्पादित करता है, और फिर फ़ॉर्म को तृतीय-पक्ष सर्वर को सबमिट करने की अनुमति देता है।
  2. अपने सर्वर पर पोस्ट करने के लिए फ़ॉर्म बनाएँ। जब फॉर्म सबमिट किया जाता है, तो उपयोगकर्ता को एक पेज दिखाते हैं, जिसमें आपके द्वारा पास किए गए सभी डेटा के साथ एक फॉर्म होता है, सभी छिपे हुए इनपुट में। बस "पुनर्निर्देशन ..." जैसा संदेश दिखाएं। फिर, तृतीय-पक्ष सर्वर को प्रपत्र सबमिट करने वाले पृष्ठ पर एक जावास्क्रिप्ट ईवेंट जोड़ें।

दोनों में से, मैं दो कारणों से दूसरा चुनूंगा। सबसे पहले, यह पहले की तुलना में अधिक विश्वसनीय है क्योंकि जावास्क्रिप्ट को इसके लिए काम करने की आवश्यकता नहीं है; उन लोगों के लिए जिनके पास यह सक्षम नहीं है, आप हमेशा छिपे हुए फॉर्म के दृश्य के लिए सबमिट बटन बना सकते हैं, और यदि इसे 5 सेकंड से अधिक समय लगता है, तो इसे दबाने का निर्देश दें। दूसरा, आप यह तय कर सकते हैं कि तीसरे पक्ष के सर्वर को कौन सा डेटा प्रेषित किया जाता है; यदि आप फॉर्म को प्रोसेस करते हैं जैसा कि यह जाता है, तो आप सभी पोस्ट डेटा के साथ गुजर रहे होंगे, जो हमेशा वह नहीं होता जो आप चाहते हैं। 307 समाधान के लिए भी, यह मानते हुए कि यह आपके सभी उपयोगकर्ताओं के लिए काम करता है।

उम्मीद है की यह मदद करेगा!


1
कृपया, "सबमिट करने के लिए एक क्लिक इवेंट जोड़ें" को "फ़ॉर्म में सबमिट ईवेंट जोड़ें" में बदलें। फॉर्म जमा करने की एक से अधिक विधियाँ हैं, जैसे कि किसी भी टेक्स्ट इनपुट के साथ एंटर दबाएं, अकेले प्रोग्रामेटिक सबमिट करें।
7

122

आप इस aproach का उपयोग कर सकते हैं:

Response.Clear();

StringBuilder sb = new StringBuilder();
sb.Append("<html>");
sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>");
sb.AppendFormat("<form name='form' action='{0}' method='post'>",postbackUrl);
sb.AppendFormat("<input type='hidden' name='id' value='{0}'>", id);
// Other params go here
sb.Append("</form>");
sb.Append("</body>");
sb.Append("</html>");

Response.Write(sb.ToString());

Response.End();

परिणाम के रूप में सही होने के बाद क्लाइंट को सर्वर से सभी एचटीएमएल मिल जाएगा घटना ऑनलोड लेती है जो फार्म सबमिट करती है और सभी डेटा को परिभाषित पोस्टबैक यूआरएल पर पोस्ट करती है।


9
+1 (यदि मैं कर सकता तो मैं आपको और अधिक)। यह जवाब है। वाक्पटु और बिंदु तक। आपने अपने सिर के ऊपर से बात करने के बजाय इसे करने के लिए सभी कोड भी शामिल किए। मैंने अपने एस्पेक्स पेज पर एक iframe में इसका इस्तेमाल किया और इसने पूरी तरह से सब कुछ प्रदान किया - कोई पुनर्लेखन यूआरएल नहीं। उत्कृष्ट कार्य! Iframe का उपयोग करने वालों के लिए TIP: मैं अपने iframe को किसी अन्य aspx पृष्ठ पर इंगित करता हूं जो इस कोड को निष्पादित करता है।
माइकेटीवी

1
यह वास्तव में कारगर है! मेरे द्वारा देखी गई एकमात्र बुरी बात यह है कि यदि आप ब्राउज़र का बैक बटन दबाते हैं, तो यह फिर से अनुरोध करता है, इसलिए आप वास्तव में पिछले पृष्ठ पर नहीं पहुंच सकते। क्या इसके लिए कोई कार्यक्षेत्र है?
माउंट। श्नाइडर

4
ऐसा करने के लिए समर्थित विधि 307 का उपयोग करने का एक कारण है। POST क्रियाओं का उद्देश्य निष्प्रभावी लेनदेन है। यह उत्तर केवल एक हैक है जो काम करता है और भविष्य में ब्राउज़र द्वारा बहुत आसानी से अवरुद्ध किया जा सकता है।
सैम रूबी

2
@ ससम अच्छा अंक। एक काउंटर तर्क के रूप में: शीर्ष उत्तर के अनुसार IE डेवलपर ने 307 के बारे में भी नहीं पढ़ा। अन्य लोगों ने इसे पढ़ा जो इसे गलत तरीके से लागू किया था। इसका मतलब है कि 307 स्पष्ट रूप से स्मार्ट के लिए भ्रामक है (ब्राउज़र डेवलपर्स स्मार्ट हैं) और व्याख्या त्रुटियों की संभावना है। ऊपर का दृष्टिकोण स्पष्ट है, कम से कम मेरे लिए और यह अतीत और वर्तमान के सभी ब्राउज़रों में काम करता है। भविष्य के बारे में बहुत चिंतित नहीं हैं क्योंकि हम डेवलपर्स अतीत (आईई 7 पढ़ते हैं) और वर्तमान में / बाहर लड़ाई करते हैं। IMHO, चूंकि हर कोई इसे सही ढंग से प्राप्त करता है, उन्हें इसे वैसे ही रखना चाहिए जैसा वह है। भविष्य में इसे अवरुद्ध करने का औचित्य क्या होगा?
so_mv

2
यह टीजीएचडब्ल्यू द्वारा दूसरे विकल्प के रूप में प्रभावी ढंग से कैसे नहीं है? क्या आप संभावित रूप से XSS भेद्यता का परिचय देने के लिए किसी लापरवाह व्यक्ति से नहीं पूछ रहे हैं?
स्कॉट

33

इसके लिए HttpWebRequest का उपयोग किया जाता है।

पोस्टबैक पर, अपनी थर्ड पार्टी को HttpWebRequest बनाएं और फॉर्म डेटा पोस्ट करें, फिर एक बार ऐसा करने के बाद, आप जहां चाहें रिस्पांस कर सकते हैं।

आपको अतिरिक्त लाभ मिलता है कि आपको अपने सभी सर्वर नियंत्रणों का नाम तृतीय पक्ष बनाने के लिए नहीं करना पड़ता है, आप यह अनुवाद POST स्ट्रिंग बनाते समय कर सकते हैं।

string url = "3rd Party Url";

StringBuilder postData = new StringBuilder();

postData.Append("first_name=" + HttpUtility.UrlEncode(txtFirstName.Text) + "&");
postData.Append("last_name=" + HttpUtility.UrlEncode(txtLastName.Text));

//ETC for all Form Elements

// Now to Send Data.
StreamWriter writer = null;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";                        
request.ContentLength = postData.ToString().Length;
try
{
    writer = new StreamWriter(request.GetRequestStream());
    writer.Write(postData.ToString());
}
finally
{
    if (writer != null)
        writer.Close();
}

Response.Redirect("NewPage");

हालाँकि, यदि आपको उपयोगकर्ता को इस फ़ॉर्म से प्रतिक्रिया पृष्ठ देखने की आवश्यकता है, तो आपका एकमात्र विकल्प Server.Transfer का उपयोग करना है, और यह काम कर भी सकता है और नहीं भी।


यह है कि मैं क्या उपयोग करने जा रहा हूँ अगर मैं asp.net फॉर्म की तुलना में एक अतिरिक्त फॉर्म चाहता हूं। मुझे बाहरी url के लिए कुछ डेटा पोस्ट करने की आवश्यकता है जो कि 3 डी सुरक्षित भुगतान के लिए है, फिर मुझे अनुरोध से दी गई जानकारी प्राप्त करने की आवश्यकता है। क्या यह ऐसा करने का तरीका है? धन्यवाद
Barbaros अल्प

यदि आपको प्रतिक्रिया देखने के लिए उपयोगकर्ता की आवश्यकता है, तो आप सामग्री और किसी भी उपयुक्त शीर्ष लेख को वापस भेज सकते हैं। आपको सापेक्ष संसाधनों के उपयोग के आधार पर परिणाम के कुछ पहलुओं को संशोधित करना पड़ सकता है, लेकिन यह निश्चित रूप से संभव है।
थॉमस एस। ट्राएस

6
उपयोगकर्ता के पास कुकी डेटा हो सकता है जो इस पद्धति से प्रेषित नहीं होगा, क्योंकि यह सर्वर से हो रहा है।
स्कॉट

7

इससे जीवन को बहुत आसान बनाना चाहिए। आप आसानी से अपने वेब एप्लिकेशन में Response.RedirectWithData (...) विधि का उपयोग कर सकते हैं।

Imports System.Web
Imports System.Runtime.CompilerServices

Module WebExtensions

    <Extension()> _
    Public Sub RedirectWithData(ByRef aThis As HttpResponse, ByVal aDestination As String, _
                                ByVal aData As NameValueCollection)
        aThis.Clear()
        Dim sb As StringBuilder = New StringBuilder()

        sb.Append("<html>")
        sb.AppendFormat("<body onload='document.forms[""form""].submit()'>")
        sb.AppendFormat("<form name='form' action='{0}' method='post'>", aDestination)

        For Each key As String In aData
            sb.AppendFormat("<input type='hidden' name='{0}' value='{1}' />", key, aData(key))
        Next

        sb.Append("</form>")
        sb.Append("</body>")
        sb.Append("</html>")

        aThis.Write(sb.ToString())

        aThis.End()
    End Sub

End Module

6

ASP.Net 3.5 में कुछ नया है यह ASP बटन की "PostBackUrl" संपत्ति है। आप इसे उस पेज के पते पर सेट कर सकते हैं जिसे आप सीधे पोस्ट करना चाहते हैं, और जब उस बटन पर क्लिक किया जाता है, तो सामान्य पेज की तरह उसी पृष्ठ पर वापस पोस्ट करने के बजाय, यह आपके द्वारा इंगित पृष्ठ पर पोस्ट करता है। हैंडी। सुनिश्चित करें कि UseSubmitBehavior TRUE पर भी सेट है।


4

सोचा कि यह साझा करना दिलचस्प हो सकता है कि हरोकू एड-ऑन प्रदाताओं के साथ एसएसओ है

यह कैसे काम करता है इसका एक उदाहरण स्रोत में "केंसा" टूल में देखा जा सकता है:

https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb

और अगर आप जावास्क्रिप्ट को चालू करते हैं तो व्यवहार में देखा जा सकता है। उदाहरण पृष्ठ स्रोत:

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Heroku Add-ons SSO</title>
  </head>

  <body>
    <form method="POST" action="https://XXXXXXXX/sso/login">

        <input type="hidden" name="email" value="XXXXXXXX" />

        <input type="hidden" name="app" value="XXXXXXXXXX" />

        <input type="hidden" name="id" value="XXXXXXXX" />

        <input type="hidden" name="timestamp" value="1382728968" />

        <input type="hidden" name="token" value="XXXXXXX" />

        <input type="hidden" name="nav-data" value="XXXXXXXXX" />

    </form>

    <script type="text/javascript">
      document.forms[0].submit();
    </script>
  </body>
</html>

3

PostbackUrl को एक अलग पेज पर पोस्ट करने के लिए आपके एस्प बटन पर सेट किया जा सकता है।

यदि आपको इसे codebehind में करना है, तो प्रयास करें Server.Transfer।


2

@Matt,

आप अभी भी HttpWebRequest का उपयोग कर सकते हैं, फिर वास्तविक आउटपुटस्ट्रीम प्रतिक्रिया को प्राप्त होने वाली प्रतिक्रिया को निर्देशित कर सकते हैं, इससे उपयोगकर्ता को प्रतिक्रिया वापस मिल जाएगी। एकमात्र मुद्दा यह है कि किसी भी रिश्तेदार के उरोजों को तोड़ दिया जाएगा।

फिर भी, यह काम कर सकता है।


2

यहाँ मैं क्या करूँगा:

डेटा को एक मानक रूप में रखें (बिना रनैट = "सर्वर" विशेषता के) और फॉर्म की कार्रवाई को लक्ष्य-ऑफ-साइट पृष्ठ पर पोस्ट करने के लिए सेट करें। सबमिट करने से पहले मैं XmlHttpRequest का उपयोग करके अपने सर्वर को डेटा सबमिट करूंगा और प्रतिक्रिया का विश्लेषण करूंगा । यदि प्रतिक्रिया का मतलब है कि आपको अपसाइड पोस्टिंग के साथ आगे बढ़ना चाहिए तो मैं (जावास्क्रिप्ट) पोस्ट के साथ आगे बढ़ूंगा अन्यथा मैं अपनी साइट पर एक पृष्ठ पर रीडायरेक्ट करूंगा


यह काम करता है, लेकिन यह ध्यान रखना महत्वपूर्ण है कि आप सभी ASP.NET सर्वर-साइड कार्यक्षमता को ढीला करते हैं।
सेनफो

2

PHP में, आप cURL के साथ POST डेटा भेज सकते हैं। क्या .NET के लिए कुछ तुलनीय है?

हां, HttpWebRequest, नीचे मेरी पोस्ट देखें।


2

GET (और HEAD) विधि का उपयोग कभी भी कुछ भी करने के लिए नहीं किया जाना चाहिए जिसके दुष्प्रभाव हों। एक साइड-इफेक्ट वेब एप्लिकेशन की स्थिति को अपडेट कर रहा हो सकता है, या हो सकता है कि यह आपके क्रेडिट कार्ड को चार्ज कर रहा हो। यदि किसी क्रिया के साइड-इफेक्ट्स होते हैं, तो इसके बजाय दूसरी विधि (POST) का उपयोग किया जाना चाहिए।

इसलिए, एक उपयोगकर्ता (या उनके ब्राउज़र) को GET द्वारा किए गए कुछ के लिए जवाबदेह नहीं ठहराया जाना चाहिए। यदि GET के परिणाम के रूप में कुछ हानिकारक या महंगे साइड-इफ़ेक्ट हुए, तो यह वेब एप्लिकेशन की गलती होगी, न कि उपयोगकर्ता की। युक्ति के अनुसार, एक उपयोगकर्ता एजेंट को नहीं होना चाहिए स्वचालित रूप से अनुप्रेषित का पालन जब तक कि यह GET या HEAD अनुरोध का जवाब न हो।

बेशक, बहुत सारे GET अनुरोधों के कुछ साइड-इफेक्ट्स होते हैं, भले ही यह सिर्फ एक लॉग फ़ाइल में संलग्न हो। महत्वपूर्ण बात यह है कि उन प्रभावों के लिए उपयोगकर्ता को नहीं बल्कि एप्लिकेशन को जिम्मेदार ठहराया जाना चाहिए।

HTTP कल्पना के संबंधित खंड 9.1.1 और 9.1.2 , और 10.3 हैं


1

मेरा सुझाव है कि यदि लागू हो तो प्रतिक्रिया पढ़ने के बाद अपने POST को निष्पादित करने और फिर रीडायरेक्ट करने के लिए एक HttpWebRequest का निर्माण करें।


1

पावलो नेमैन की पद्धति पर आधारित कॉपी-पेस्ट करने योग्य कोड

RedirectPost (स्ट्रिंग url, T bodyPayload) और GetPostData () उन लोगों के लिए हैं जो सिर्फ स्रोत पृष्ठ में कुछ दृढ़ता से टाइप किए गए डेटा को डंप करना चाहते हैं और इसे लक्ष्य एक में वापस लाते हैं। डेटा न्यूटनॉफ्ट Json.NET द्वारा क्रमबद्ध होना चाहिए और आपको पाठ्यक्रम की लाइब्रेरी को संदर्भित करने की आवश्यकता है।

बस अपने पृष्ठों में कॉपी-पेस्ट करें या अपने पृष्ठों के लिए बेहतर अभी तक आधार वर्ग का उपयोग करें और इसका उपयोग आप कहीं भी करें।

मेरा दिल आप सभी के लिए है जो अभी भी 2019 में वेब फॉर्म का उपयोग करने के लिए जो भी कारण है।

        protected void RedirectPost(string url, IEnumerable<KeyValuePair<string,string>> fields)
        {
            Response.Clear();

            const string template =
@"<html>
<body onload='document.forms[""form""].submit()'>
<form name='form' action='{0}' method='post'>
{1}
</form>
</body>
</html>";

            var fieldsSection = string.Join(
                    Environment.NewLine,
                    fields.Select(x => $"<input type='hidden' name='{HttpUtility.UrlEncode(x.Key)}' value='{HttpUtility.UrlEncode(x.Value)}'>")
                );

            var html = string.Format(template, HttpUtility.UrlEncode(url), fieldsSection);

            Response.Write(html);

            Response.End();
        }

        private const string JsonDataFieldName = "_jsonData";

        protected void RedirectPost<T>(string url, T bodyPayload)
        {
            var json = JsonConvert.SerializeObject(bodyPayload, Formatting.Indented);
            //explicit type declaration to prevent recursion
            IEnumerable<KeyValuePair<string, string>> postFields = new List<KeyValuePair<string, string>>()
                {new KeyValuePair<string, string>(JsonDataFieldName, json)};

            RedirectPost(url, postFields);

        }

        protected T GetPostData<T>() where T: class 
        {
            var urlEncodedFieldData = Request.Params[JsonDataFieldName];
            if (string.IsNullOrEmpty(urlEncodedFieldData))
            {
                return null;// default(T);
            }

            var fieldData = HttpUtility.UrlDecode(urlEncodedFieldData);

            var result = JsonConvert.DeserializeObject<T>(fieldData);
            return result;
        }

0

आमतौर पर, आपको इन दोनों अनुरोधों के बीच किसी न किसी राज्य को ले जाने की आवश्यकता होगी। ऐसा करने के लिए वास्तव में एक बहुत ही मजेदार तरीका है जो जावास्क्रिप्ट पर निर्भर नहीं करता है (विचार करें <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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.