2013-07-10 11 views
11

में लंबे समय तक चलने वाला कार्य यहां मेरी समस्या है: मुझे एपीकंट्रोलर के अंदर कई तृतीय पक्ष विधियों को कॉल करने की आवश्यकता है। उन तरीकों के लिए हस्ताक्षर Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData) है। मैं चाहता हूं कि उन कॉल को पृष्ठभूमि में चलना जारी रखें, ApiController ने डेटा को क्लाइंट को वापस भेज दिया है। जब DoSomethingAsync पूरा करता है तो मैं कुछ लॉगिंग करना चाहता हूं और शायद कुछ डेटा फ़ाइल सिस्टम में सहेज सकता हूं। मैं उसे कैसे कर सकता हूँ? मैं asyny/इंतजार वाक्यविन्यास का उपयोग करना पसंद करेंगे।वेबएपीआई

+0

आपके कार्य में 'ContinueWith' जैसा कुछ है। यह वह जगह है जहां आप अपना लॉगिंग कर सकते हैं। –

+0

जब आप कहते हैं "ApiController के बाद डेटा को क्लाइंट को वापस भेज दिया गया है", तो क्या आपका मतलब है कि कनेक्शन भी बंद है? क्या ग्राहक अभी भी कनेक्शन को खोलते समय सर्वर से डेटा प्राप्त कर सकता है? –

+0

हां, कनेक्शन बंद है। – TEst16

उत्तर

7

स्टीफन ने वर्णन किया कि एक एपीकंट्रोलर के अंदर अनिवार्य रूप से लंबे समय से चलने वाले अग्नि-और-भूल कार्यों को क्यों शुरू करना एक बुरा विचार है।

शायद आपको उन आग-और-भूल कार्यों को निष्पादित करने के लिए एक अलग सेवा बनाना चाहिए। सेवा एक अलग एपीकंट्रोलर हो सकता है, एक कतार के पीछे एक कार्यकर्ता, जो कुछ भी स्वयं पर होस्ट किया जा सकता है और एक स्वतंत्र जीवनकाल हो सकता है।

यह विभिन्न कार्य जीवनकाल का प्रबंधन बहुत आसान और एपीकंट्रोलर की मुख्य जिम्मेदारियों से लंबे समय तक चलने वाले कार्यों की चिंताओं को अलग करेगा।

+1

एक और कारण यह है कि एक अलग सेवा होना बेहतर है, जिससे इसे स्केल करना आसान हो जाता है। उदाहरण के लिए, हो सकता है कि आपको लगता है कि आपको अपने लंबे समय तक चलने वाले कार्य को चलाने के लिए अधिक सर्वर की आवश्यकता है, लेकिन आपकी वेबसाइट चलाने के लिए अधिक सर्वर नहीं हैं। शुरुआत में इन्हें विभाजित करके आप अपने स्केल-आउट समाधान को बेहतर ढंग से अनुकूलित कर सकते हैं। – jt000

16

आप लगभग कभी ऐसा नहीं करना चाहते हैं। यह लगभग हमेशा एक बड़ी गलती है।

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

कहा कि, अगर आप पूरी तरह से सुनिश्चित है कि आप इस बेहद खतरनाक डिजाइन लागू करना चाहते हैं, तो आप BackgroundTaskManager from my blog का उपयोग कर सकते हैं।

+1

Azure-WebJobs से पहले सही। अब आप Azure-WebJobs के साथ ऐसा कर सकते हैं। एक कार्यकर्ता भूमिका सबसे मजबूत दृष्टिकोण है। – RickAndMSFT

+0

मुझे लगता है कि यह एक स्वीकार्य व्यापार है जैसे डीबग-लॉगिंग, प्रदर्शन रिकॉर्डिंग, ईवेंट ट्रैकिंग (बाहरी सेवा का उपयोग करना)। इन सभी मामलों में एक "अग्नि-और-भूल" अर्थपूर्ण स्वीकार्य है और हम वास्तव में परवाह नहीं करते हैं कि सेवा के मामले में व्यक्तिगत घटनाएं खो सकती हैं या नहीं। या क्या मुझे कुछ याद आ रहा है? –

+0

@ जोहान्स रुडॉल्फ: मैं कहूंगा कि प्राथमिक उपयोग केस कैश अपडेट है। लॉगिंग करने का यह एक स्वीकार्य तरीका है, अगर आप स्वीकार करते हैं कि आपके लॉग में सभी डेटा नहीं हो सकते हैं। मैं एक व्यापार आवश्यकता के रूप में "घटना ट्रैकिंग" की व्याख्या करता हूं, इसलिए इसके लिए एक अच्छा उपयोग केस नहीं है। यदि "ईवेंट ट्रैकिंग" महत्वपूर्ण नहीं है, तो "डीबग लॉगिंग", "प्रदर्शन रिकॉर्डिंग", और "ईवेंट ट्रैकिंग" केवल तीन अलग-अलग प्रकार के लॉगिंग हैं। ध्यान दें कि एएसपी.नेट 4.5.2 में अब कुछ समान अंतर्निहित है। –

16

अच्छी खबर है पर एक नज़र डालें, वहाँ में नेट 4.5.2 QueueBackgroundWorkItem नामक एक नया समाधान है एपीआई। यह उपयोग करना वास्तव में आसान है:

HostingEnvironment.QueueBackgroundWorkItem(ct => DoSomething(a, b, c)); 

यहां एक लेख है जो इसे विस्तार से वर्णित करता है।

https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/

और यहाँ anohter लेख है कि कुछ अन्य तरीकों इस सूत्र में उल्लेख नहीं उल्लेख है। http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

+3

QueueBackgroundWorkItem एक समाधान हो सकता है यदि लंबे समय तक चलने वाला कार्य वास्तव में लंबे समय तक चलने वाला नहीं है, यानी अगर यह 90 सेकंड से भी कम समय में समाप्त हो सकता है। यदि यह वास्तव में लंबे समय से चल रहा है तो एक और समाधान की आवश्यकता है (जैसे इसे विंडोज सेवा पर सौंपना) –

+0

मैं इसे विंडोज सेवा (बैकएंड डेटा लेयर) के भीतर एक स्व-होस्टेड वेबएपीआई में काम करने के लिए नहीं मिला। –

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