में लंबे समय तक चलने वाला कार्य यहां मेरी समस्या है: मुझे एपीकंट्रोलर के अंदर कई तृतीय पक्ष विधियों को कॉल करने की आवश्यकता है। उन तरीकों के लिए हस्ताक्षर Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData)
है। मैं चाहता हूं कि उन कॉल को पृष्ठभूमि में चलना जारी रखें, ApiController ने डेटा को क्लाइंट को वापस भेज दिया है। जब DoSomethingAsync
पूरा करता है तो मैं कुछ लॉगिंग करना चाहता हूं और शायद कुछ डेटा फ़ाइल सिस्टम में सहेज सकता हूं। मैं उसे कैसे कर सकता हूँ? मैं asyny/इंतजार वाक्यविन्यास का उपयोग करना पसंद करेंगे।वेबएपीआई
वेबएपीआई
उत्तर
स्टीफन ने वर्णन किया कि एक एपीकंट्रोलर के अंदर अनिवार्य रूप से लंबे समय से चलने वाले अग्नि-और-भूल कार्यों को क्यों शुरू करना एक बुरा विचार है।
शायद आपको उन आग-और-भूल कार्यों को निष्पादित करने के लिए एक अलग सेवा बनाना चाहिए। सेवा एक अलग एपीकंट्रोलर हो सकता है, एक कतार के पीछे एक कार्यकर्ता, जो कुछ भी स्वयं पर होस्ट किया जा सकता है और एक स्वतंत्र जीवनकाल हो सकता है।
यह विभिन्न कार्य जीवनकाल का प्रबंधन बहुत आसान और एपीकंट्रोलर की मुख्य जिम्मेदारियों से लंबे समय तक चलने वाले कार्यों की चिंताओं को अलग करेगा।
एक और कारण यह है कि एक अलग सेवा होना बेहतर है, जिससे इसे स्केल करना आसान हो जाता है। उदाहरण के लिए, हो सकता है कि आपको लगता है कि आपको अपने लंबे समय तक चलने वाले कार्य को चलाने के लिए अधिक सर्वर की आवश्यकता है, लेकिन आपकी वेबसाइट चलाने के लिए अधिक सर्वर नहीं हैं। शुरुआत में इन्हें विभाजित करके आप अपने स्केल-आउट समाधान को बेहतर ढंग से अनुकूलित कर सकते हैं। – jt000
आप लगभग कभी ऐसा नहीं करना चाहते हैं। यह लगभग हमेशा एक बड़ी गलती है।
एएसपी.नेट (और अधिकांश अन्य सर्वर) इस धारणा पर काम करते हैं कि सभी अनुरोध पूरा होने के बाद आपकी सेवा को फाड़ना सुरक्षित है। तो आपके पास कोई गारंटी नहीं है कि आपका लॉगिंग किया जाएगा, या आपका डेटा डिस्क पर लिखा जाएगा। विशेष रूप से डिस्क लिखने के साथ, यह पूरी तरह से संभव है कि आपके लेखन दूषित हो जाएंगे।
कहा कि, अगर आप पूरी तरह से सुनिश्चित है कि आप इस बेहद खतरनाक डिजाइन लागू करना चाहते हैं, तो आप BackgroundTaskManager
from my blog का उपयोग कर सकते हैं।
Azure-WebJobs से पहले सही। अब आप Azure-WebJobs के साथ ऐसा कर सकते हैं। एक कार्यकर्ता भूमिका सबसे मजबूत दृष्टिकोण है। – RickAndMSFT
मुझे लगता है कि यह एक स्वीकार्य व्यापार है जैसे डीबग-लॉगिंग, प्रदर्शन रिकॉर्डिंग, ईवेंट ट्रैकिंग (बाहरी सेवा का उपयोग करना)। इन सभी मामलों में एक "अग्नि-और-भूल" अर्थपूर्ण स्वीकार्य है और हम वास्तव में परवाह नहीं करते हैं कि सेवा के मामले में व्यक्तिगत घटनाएं खो सकती हैं या नहीं। या क्या मुझे कुछ याद आ रहा है? –
@ जोहान्स रुडॉल्फ: मैं कहूंगा कि प्राथमिक उपयोग केस कैश अपडेट है। लॉगिंग करने का यह एक स्वीकार्य तरीका है, अगर आप स्वीकार करते हैं कि आपके लॉग में सभी डेटा नहीं हो सकते हैं। मैं एक व्यापार आवश्यकता के रूप में "घटना ट्रैकिंग" की व्याख्या करता हूं, इसलिए इसके लिए एक अच्छा उपयोग केस नहीं है। यदि "ईवेंट ट्रैकिंग" महत्वपूर्ण नहीं है, तो "डीबग लॉगिंग", "प्रदर्शन रिकॉर्डिंग", और "ईवेंट ट्रैकिंग" केवल तीन अलग-अलग प्रकार के लॉगिंग हैं। ध्यान दें कि एएसपी.नेट 4.5.2 में अब कुछ समान अंतर्निहित है। –
जैसा कि दूसरों द्वारा इंगित किया गया है, अनुशंसित नहीं है। बहरहाल, जब भी जरूरत है वहाँ एक रास्ता है, इसलिए IRegisteredObject
भी देखें
अच्छी खबर है पर एक नज़र डालें, वहाँ में नेट 4.5.2 QueueBackgroundWorkItem नामक एक नया समाधान है एपीआई। यह उपयोग करना वास्तव में आसान है:
HostingEnvironment.QueueBackgroundWorkItem(ct => DoSomething(a, b, c));
यहां एक लेख है जो इसे विस्तार से वर्णित करता है।
और यहाँ anohter लेख है कि कुछ अन्य तरीकों इस सूत्र में उल्लेख नहीं उल्लेख है। http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
QueueBackgroundWorkItem एक समाधान हो सकता है यदि लंबे समय तक चलने वाला कार्य वास्तव में लंबे समय तक चलने वाला नहीं है, यानी अगर यह 90 सेकंड से भी कम समय में समाप्त हो सकता है। यदि यह वास्तव में लंबे समय से चल रहा है तो एक और समाधान की आवश्यकता है (जैसे इसे विंडोज सेवा पर सौंपना) –
मैं इसे विंडोज सेवा (बैकएंड डेटा लेयर) के भीतर एक स्व-होस्टेड वेबएपीआई में काम करने के लिए नहीं मिला। –
- 1. वेबएपीआई
- 2. वेबएपीआई
- 3. वेबएपीआई
- 4. वेबएपीआई
- 5. वेबएपीआई
- 6. एएसपीनेट वेबएपीआई
- 7. वेबएपीआई json
- 8. वेबएपीआई सी #
- 9. वेबएपीआई एक्सएमएल
- 10. एएसपी.NET वेबएपीआई
- 11. वेबएपीआई नियंत्रक
- 12. वेबएपीआई एक्शन
- 13. एएसपी.नेट वेबएपीआई
- 14. वेबएपीआई कॉल
- 15. मैं डब्लूसीएफ वेबएपीआई वेबगेट
- 16. एएसएमएक्स से वेबएपीआई
- 17. अपवाद: वेबएपीआई 2
- 18. झलक वेबएपीआई समर्थन
- 19. पेटापोको गतिशील और वेबएपीआई
- 20. जेएसओएन डेटा वेबएपीआई
- 21. एमवीसी 4/वेबएपीआई
- 22. वेबएपीआई मॉडल जेएसओएन
- 23. वेबएपीआई (मध्यम ट्रस्ट)
- 24. वेबएपीआई और रावेनडीबी
- 25. उत्पन्न मार्ग यूआरएल वेबएपीआई
- 26. वेबएपीआई डिबगिंग - दृश्य स्टूडियो
- 27. ब्रीज और RESTful वेबएपीआई
- 28. गरीब वेबएपीआई प्रदर्शन
- 29. वेबएपीआई सर्वर पक्ष
- 30. धारावाहिक एएसपी.NET वेबएपीआई ऑब्जेक्ट
आपके कार्य में 'ContinueWith' जैसा कुछ है। यह वह जगह है जहां आप अपना लॉगिंग कर सकते हैं। –
जब आप कहते हैं "ApiController के बाद डेटा को क्लाइंट को वापस भेज दिया गया है", तो क्या आपका मतलब है कि कनेक्शन भी बंद है? क्या ग्राहक अभी भी कनेक्शन को खोलते समय सर्वर से डेटा प्राप्त कर सकता है? –
हां, कनेक्शन बंद है। – TEst16