2015-01-19 8 views
7

समस्याएक MVC 5 कार्रवाई फिल्टर

मैं इस साइट विन्यास को पुनः प्राप्त करने के लिए एक API द्वारा विधि है में एक async कॉल करना। मैं ऐसा करने के लिए httpClient और GetAsync() विधि का उपयोग कर रहा हूं।

HttpResponseMessage response = await client.GetAsync("api/{0}/config", id); 

जैसा कि मुझे साइट पर इस कॉन्फ़िगरेशन की आवश्यकता है, इसलिए मैंने इसके लिए एक वैश्विक क्रिया फ़िल्टर का उपयोग करने की योजना बनाई।

प्रश्न

मैं एक MVC कार्रवाई फिल्टर में एक async विधि कैसे फोन कर सकते हैं? या क्या इस समस्या का बेहतर समाधान है?

मैंने इस पर कई SO प्रश्न (Async action filter in MVC 4) देखा है लेकिन मुझे एक संतोषजनक समाधान नहीं मिला है।

+0

क्या आप वेबएपीआई पर स्विच कर सकते हैं? :) –

+0

@YuvalItzchakov मेरी इच्छा है! :) –

+1

http://stackoverflow.com/questions/12482338/async-action-filter-in-mvc-4 –

उत्तर

12

एएसपी.नेट एमवीसी 5 एक्शन फ़िल्टर से एसिंक्रोनस विधि को कॉल करने (विश्वसनीय रूप से) करने का कोई तरीका नहीं है। यह पहले से ही एएसपी.नेट वीएनएक्स्ट में तय किया गया है, लेकिन AFAIK एमवीसी 5 में इसका समर्थन करने की कोई योजना नहीं है।

यदि आपको इसे एक्शन फ़िल्टर में बिल्कुल करना है, तो आपको सिंक्रोनस कॉल (उदाहरण के लिए, WebClient) का उपयोग करना होगा HttpClient)।

+1

धन्यवाद। क्या आप इस 'कार्य' (कुछ) => GetSomethingAsync (आईडी)) जैसे कुछ करने के खिलाफ सलाह देंगे। परिणाम; 'कार्रवाई फ़िल्टर में। यदि ऐसा है तो आप कारण बता सकते हैं। –

+3

@ कोलिबैकॉन: [कुछ हैक्स] हैं (http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638.aspx) आप "async पर सिंक" को मजबूर करने के लिए उपयोग कर सकते हैं , लेकिन हर किसी में कमी है। 'टास्क.रुन' एएसपी.नेट थ्रेड पूल हेरिस्टिक्स में हस्तक्षेप करेगा, जो स्केलेबिलिटी को नकारात्मक रूप से प्रभावित करेगा। साथ ही, 'टास्क.रुन' वर्तमान एएसपी.NET अनुरोध संदर्भ के बाहर * GetSomethingAsync' * को स्पष्ट रूप से चलाएगा - चाहे यह काम करेगा या नहीं, वास्तव में 'GetSomethingAsync' क्या करने का प्रयास करता है। तो संक्षेप में, यह काम कर सकता है (एक छोटे से प्रदर्शन हिट के साथ), या यह नहीं हो सकता है - आपकी विधि के कार्यान्वयन पर निर्भर करता है। –

+4

मैं स्केलेबिलिटी पर नकारात्मक प्रभाव की पुष्टि कर सकता हूं। हमारे पास Azure पर उत्पादन में बहुत बड़ी साइट चल रही है और मैं यह सही काम कर रहा था: 'कार्य। रुन (() => DoSomethingAsync)। एक एक्शन फ़िल्टर में .ait() '। भारी भार पर इसके परिणामस्वरूप भयानक प्रदर्शन हुआ। अनुरोध कतार में अनुरोध जोड़े गए थे क्योंकि थ्रेड थक गए थे। सीपीयू कम था इसलिए एसिंक काम तीसरी पार्टी सेवा को कॉल करने के रूप में कोई उदाहरण नहीं जोड़ा जाएगा। हम +100 सेकंड के प्रतिक्रिया समय के साथ समाप्त हो गया। ऐसा न करें :-) – Razzie

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