2016-12-07 7 views
5

मेरे पास एक सी # एएसपी.Net (गैर एमवीसी) प्रोजेक्ट है जो अजाक्स धूमकेतु लंबे मतदान का उपयोग करता है। एक वेब पेज IHttpAsyncHandler को लागू करने वाले वर्ग द्वारा प्रबंधित एंडपॉइंट पर HTTP कॉल करता है।वेबएपीआई 2 के माध्यम से सी # अजाक्स धूमकेतु कैसे करें?

यदि वेब पेज पर रिपोर्ट करने के लिए कुछ भी नहीं है (एन सेकेंड के भीतर), तो एक खाली HTTP प्रतिक्रिया भेजी जाती है, और वेबपृष्ठ पुनः कॉल करता है। अगर भेजने के लिए कुछ है, और अद्यतन भेजा जाता है, और वेबपृष्ठ प्रक्रियाओं और फिर से कॉल करता है। यह सुंदर मानक पुश प्रौद्योगिकी है, और बहुत अच्छी तरह से काम करता है।

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

मैं एपीआई कॉल के लिए पुश तकनीक स्थापित करना चाहता हूं, ताकि एपीआई उपयोगकर्ताओं को अपडेट के लिए मतदान नहीं करना पड़े।

उपर्युक्त विधि के समान, एपीआई एंडपॉइंट कॉल प्राप्त होता है, और संदर्भ संग्रहीत किया जाता है। यदि टाइमआउट समाप्त हो जाता है, तो कॉल खाली कर दिया जाता है, और कॉलर से फिर से कॉल करने की उम्मीद है। यदि टाइमआउट के भीतर डेटा अपडेट होता है, तो डेटा कॉलर पर वापस कर दिया जाता है, और फिर कॉलर को फिर से कॉल करने और अधिक अपडेट की प्रतीक्षा करने की उम्मीद है।

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

मैं एक एपीकंट्रोलर कैसे स्थापित कर सकता हूं ताकि कॉल को थ्रेड प्रोसेसिंग मुक्त कर दिया जा सके, कॉल संदर्भ संग्रहीत हो, और मैं बाद में किसी बिंदु पर कॉल को प्रतिक्रिया भेज सकता हूं?

+1

आप सिग्नलआर का उपयोग क्यों नहीं करते? –

+0

लंबे मतदान कार्य करता है और विशेष रूप से खराब गुणवत्ता वाले कनेक्शन के लिए बहुत ही कुशल है। यह अच्छी तरह से काम कर रहा है। मुझे बस यह पता लगाने की आवश्यकता है कि वेबएपीआई 2 कनेक्शन को कैसे लटकाया जाए जैसे कि यह एक मानक HTTP अनुरोध था। –

उत्तर

2

आप async उपयोग कर सकते हैं/प्राप्त करने के लिए क्या आप चाहते हैं यानी इंतजार:

[HttpPost] 
public async Task<HttpResponseMessage> LongRunningOperation([FromBody]Input obj) 
{ 
    // Do what ever you need with input data   

    await WaitForEvent();   

    // Do what ever you need to return a response 

    return someResponse; 
} 

इस उदाहरण वेब एपीआई विधि async के रूप में घोषित किया जाता है और उसके शरीर में await ऑपरेटर एक पूल के लिए एक धागा वापस जाने के लिए इस्तेमाल किया गया था में ।

मुझे लगता है कि धूमकेतु को लागू करने के लिए आप किसी प्रकार की घटनाओं का उपयोग करते हैं। जहां तक ​​मुझे कई साल पहले याद आया, मैंने ऐसा करने के लिए ManualResetEvent का उपयोग किया। हालांकि, यह और कुछ भी हो सकता है।

महत्वपूर्ण बात यह है कि WaitForEvent विधि कुछ प्रतीक्षा करने योग्य होनी चाहिए। दूसरे शब्दों में ManualResetEvent या अन्य प्रतीक्षा हैंडल को किसी कार्य में लपेटा जाना चाहिए। आप AsyncFactory.FromWaitHandle विधि के साथ ऐसा कर सकते हैं।

वेब एपीआई के संदर्भ में एसिन/प्रतीक्षा के बारे में discussion पढ़ने के लायक भी है।

+0

मैं सामान्य थ्रेड wrangling के लिए कहीं और घटनाओं का उपयोग, लेकिन उन्हें यहां उपयोग करने के लिए सोचा नहीं था। मैं इस कोशिश की कोशिश करूंगा, पोस्ट के लिए धन्यवाद। –

+0

वेबसाइट धूमकेतु के लिए, वर्तमान में मैं async एचटीपी हैंडलर का उपयोग करता हूं। यह एक व्युत्पन्न AsyncResult ऑब्जेक्ट बनाता है जो http संदर्भ को लपेटता है। AsyncResult ऑब्जेक्ट्स को संग्रह में तब तक संग्रहीत किया जाता है जब तक कि टाइमआउट समाप्त नहीं हो जाता है, या डेटा आता है। जब भी होता है, संदर्भ अनुरोध पूरा हो जाता है। क्लाइंट टाइमआउट पर या तो खाली समय या डेटाआउट के साथ प्रतिक्रिया के समय कुछ समय (यानी क्लासिक धूमकेतु), और किसी भी तरह से, ग्राहक loops और पुनः अनुरोध के साथ प्रतिक्रिया का अनुभव करता है। क्लाइंट लगभग हमेशा जुड़े हुए हैं, डेटा के लिए निष्क्रिय रूप से प्रतीक्षा कर रहे हैं, धागे को बांध दिए बिना। –

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