2012-06-20 18 views
5

मेरे पास एक ऐसा पृष्ठ है जहां कोई उपयोगकर्ता ऑर्डर सबमिट करता है, और इसे सबमिट करने के बाद, मैं वास्तव में बाहरी पृष्ठ पर रीडायरेक्ट किए बिना एक यूआरएल (http://externalsite.com?id=12345&sessionid=abc123) हिट करना चाहता हूं।मैं यूआरएल की यात्रा कैसे अनुकरण कर सकता हूं?

क्या ऐसा करने का कोई तरीका है?

+2

क्या आपको इसे लाने के लिए * उपयोगकर्ता का ब्राउज़र * चाहिए, या आप इसे अपने सर्वर से कर सकते हैं? –

उत्तर

8

निश्चित रूप से, अपने सर्वर-साइड कोड से HttpWebRequest का उपयोग करें। यहाँ एक उदाहरण है:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
    "http://externalsite.com?id=12345&sessionid=abc123"); 
request.Method = "GET"; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    string result = reader.ReadToEnd(); 
    // Process the response text if you need to... 
} 
2

आप अपने सर्वर साइड Asp.Net कोड में HTTP अनुरोध मुद्दों के लिए WebClient वर्ग इस्तेमाल कर सकते हैं। इसके परिणामस्वरूप आप परिणामस्वरूप एचटीएमएल के साथ जो भी चाहें कर सकते हैं।

5

आप http://externalsite.com/ पर उपयोगकर्ता की कुकीज़ (लॉगइन विवरण और अन्य उपयोगकर्ता सेटिंग) की जरूरत है, तो आप एक <iframe>या एक नाटक छवि एम्बेड या उपयोगकर्ता के ब्राउज़र से एक ajax अनुरोध कर सकते हैं।

एक <iframe> का उपयोग करना:

का उपयोग करते हुए एक "नाटक" छवि अनुरोध (यदि आप किसी भी संभावित छवि प्रकार की समस्याओं की उपेक्षा कर सकते): इसके सरलतम रूप में jQuery's cross-browser ajax support का उपयोग

<img src="http://externalsite.com?id=12345&sessionid=abc123" width="1" height="1" /> 

:

$.ajax({ 
    url: "http://externalsite.com?id=12345&sessionid=abc123" 
}); 

आप हाय को अतिरिक्त स्वरूपण भी लागू कर सकते हैं iframe या image de, या जावास्क्रिप्ट का उपयोग करके इसे हटा दें जब उसने अन्य सर्वर को मारने के अपने उद्देश्य को पूरा किया है।

0

वॉयथोस और जोएल पुरा से ऊपर दिए गए दो उत्तरों का मिश्रण, मेरा सुझाव है कि आप तीसरे विकल्प पर भी विचार करें। नीचे मेरा मूल्यांकन है:

1) साइट पर मारने का अधिक आश्वासन तरीका यह है कि उपयोगकर्ता की जानकारी के वास्तविक जमा के लिए अपने एक्शन हैंडलर के हिस्से के रूप में सर्वर-साइड करना है।

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
    "http://externalsite.com?id=12345&sessionid=abc123"); 
request.Method = "GET"; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    string result = reader.ReadToEnd(); 
    // Process the response text if you need to... 
} 

यह आपके सर्वर अपने सर्वर को मारा और सुनिश्चित करें कि यह कहा जाता हो जाता है कि कर सकते हैं: यही कारण है कि आसानी से ऊपर voithos 'विधि के माध्यम से किया जा सकता है। इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह आपके सर्वर को द्वितीयक HTTP अनुरोध का ओवरहेड बनाता है। यदि दूसरा सर्वर धीमा है, तो यह अवरुद्ध करने वाला मुद्दा बना सकता है जो आपके अंत में स्पष्ट मंदता पैदा करेगा। आप बहु-थ्रेडेड/एसिंक जाकर इसे प्राप्त कर सकते हैं - लेकिन आपको तस्वीर मिलती है: यह आपके नियंत्रण से बाहर हल करने के लिए समस्याओं का एक गुच्छा पेश करता है - लेकिन - यह सुनिश्चित करता है कि आप जानते हैं कि रिमोट स्रोत मारा गया था या नहीं, और जवाब क्या था।

2) वैकल्पिक रूप से, यदि आपका उपयोगकर्ता वास्तविक पोस्ट कर रहा है और एक नए पृष्ठ के रूप में एक HTML प्रतिक्रिया वापस प्राप्त कर रहा है, तो आप उस परिणाम पृष्ठ के HTML में जोएल पुरा की प्रतिक्रिया को इंजेक्ट कर सकते हैं, जिससे उपयोगकर्ता के ब्राउज़र को हिट करने के लिए जिम्मेदार ठहराया जा सकता है रीमोट सर्वर।

<div style="display: none;"> 
<iframe src="http://externalsite.com?id=12345&sessionid=abc123"></iframe> 
</div> 

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

3) यदि आपके पास अपनी प्रसंस्करण करने के लिए jQuery जैसी क्लाइंट-साइड लाइब्रेरी का उपयोग करने की क्षमता है, तो मैं सुझाव दूंगा कि आपके पास सभी फॉर्म सबमिशन इन-लाइन और असीमित रूप से होते हैं। दृष्टिकोण कुछ इस तरह होगा:

<script type="text/javascript"> 
    $(document).bind('ready', function() { 
     $('#formSubmitButton').bind('click', function (ev) { 
      ev.preventDefault(); // These two lines stop the default processing from 
      ev.stopPropagation(); // occurring on form-submit (i.e. no full post-back) 

      // This line starts an asynchronous call to the server, posting your form 
      // data itself. 
      $.ajax({ 
       url: '/My/Post/Url', 
       type: 'POST', 
       async: false, 

       // You could use a library for this kind of form parsing. I suggest 
       // http://www.json.org/js.html - for serialization, and 
       // http://code.google.com/p/form2js/ - for form conversion. It's great. 
       data: { my: 'form', data: 'fields' }, 

       success: function (data) { 
        $.ajax({ 
         url: '/The/External/Url', 
         type: 'POST', 
         async: false, 

         data: { external: 'data', goes: 'here' }, 
         success: function (remoteData) { 
          if (remoteData) // validate response here 
           displaySuccess(); 
          else 
           displayFailure(); 
         }, 
         error: displayFailure 
        }); 
       }, 
       error: displayFailure 
      }); 
     }); 
    }); 
</script> 

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

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

संबंधित मुद्दे