2010-03-09 9 views
15

मैं asp.net mvc अनुप्रयोग के भीतर नियमित घटनाओं को निर्धारित करने के लिए quartz.net का उपयोग कर रहा हूं।एएसपी.नेट एमवीसी: एक प्रयोग योग्य UrlHelper उदाहरण कैसे बनाएँ?

अनुसूचित नौकरी को एक सेवा परत स्क्रिप्ट को कॉल करना चाहिए जिसके लिए एक UrlHelper उदाहरण की आवश्यकता है (सही मार्गों (via urlHelper.Action(..)) पर आधारित यूआरएल बनाने के लिए जो सेवा द्वारा भेजे जाएंगे)।

मैं ईमेल में लिंक को हार्डकोड नहीं करना चाहता - उन्हें urlhelper का उपयोग करके हल किया जाना चाहिए।

काम:

public class EvaluateRequestsJob : Quartz.IJob 
{ 
    public void Execute(JobExecutionContext context) 
    { 
     // where to get a usable urlHelper instance? 
     ServiceFactory.GetRequestService(urlHelper).RunEvaluation(); 
    } 
} 

कृपया ध्यान दें कि इस MVC पाइप लाइन के भीतर नहीं चला है। कोई वर्तमान अनुरोध नहीं किया जा रहा है, कोड निर्धारित समय पर क्वार्ट्ज शेड्यूलर द्वारा चलाया जाता है।

मुझे संकेतित जगह पर यूआरएलहेल्पर उदाहरण उपयोग करने योग्य कैसे मिल सकता है?

यदि UrlHelper का निर्माण करना संभव नहीं है, तो दूसरा विकल्प यह है कि मैं एक HTTP अनुरोध करके "स्वयं कॉल" नियंत्रक कार्रवाई कर रहा हूं - कार्रवाई को निष्पादित करते समय मुझे निश्चित रूप से UrlHelper उदाहरण होगा उपलब्ध - लेकिन यह मेरे लिए थोड़ा सा हैकी लगता है।

+1

वाह नकारात्मक वोट इस सूत्र पर बाहर जा रहे हैं :) – Kelsey

+0

@Kelsey शायद यह है, क्योंकि सवाल भी तुच्छ ताकि लोगों को तुच्छ या अप्रासंगिक देने के लिए करते हैं हो रहा है उत्तर या प्रश्न को कम से कम ज्ञात ढांचे (क्वार्ट्ज) – Marek

+0

के कम से कम बुनियादी ज्ञान की आवश्यकता नहीं है क्या यह क्वार्ट्ज शेड्यूलर उस विधि के समान कुछ उपयोग करता है जिस पर जेफ ने एक पोस्ट किया: http://blog.stackoverflow.com/2008/07/ आसान-पृष्ठभूमि-कार्य-इन-एस्पनेट /? – Kelsey

उत्तर

5

कैसे सिर्फ इस answer में के रूप में UrlHelpler के लिए एक नया HttpContext बनाने के बारे में:

+0

इस बीच मैंने एक अलग दृष्टिकोण का उपयोग किया है, लेकिन ऐसा लगता है कि यह काम कर सकता है, भले ही यह थोड़ा हैकी हो। उत्तर खोजने के लिए धन्यवाद :) – Marek

+0

@Marek - आपने अपनी समस्या का समाधान कैसे किया? मुझे एक ही समस्या है जहां मुझे एक दृश्य प्रस्तुत करने के लिए HttpContext की आवश्यकता है क्योंकि क्वार्ट्ज किए जाने के बाद मैं एक ईमेल भेजने के लिए उस दृश्य का उपयोग करता हूं। – chobo2

+0

@chobo - मैंने एक बाहरी ऐप तैयार किया जो पुनरावर्ती http अनुरोध करता है और नियंत्रक क्रियाओं में तर्क लागू करता है। – Marek

1

संपादित करें: क्षमा करें मैं अनुमान लगाता हूं कि मैं पूरी तरह से गलत प्रश्न पढ़ता हूं।

यह आपके शेड्यूलर की तरह लगता है (जो मुझे नहीं पता कि यह कैसे काम करता है) एक अलग प्रक्रिया है और आप UrlHelper को अपने एमवीसी ऐप में वैध यूआरएल उत्पन्न करने में मदद करना चाहते हैं?

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

आशा है कि यह एक उत्तर का थोड़ा बेहतर होगा। अगर मैं पूरी तरह से बंद हूं तो मुझे बताएं ... मेरी प्रतिक्रिया को हटाने जा रहा था लेकिन सोचा कि मैं इसे एक और शॉट दूंगा।

+0

धन्यवाद, विचार केवल एक ही "हार्डकोडेड" प्रसिद्ध यूआरएल है जो आवश्यक मार्ग मैपिंग प्रदान करता है दिलचस्प है - भले ही यह एक ऐसी क्रिया को कॉल करने के बराबर है जो HTTP अनुरोध के साथ मूल्यांकन सेवा को बंद कर देगा। अब मेरे डाउनवोट को पूर्ववत करना :) – Marek

+0

हां मैं ऐसा करने के किसी भी अन्य तरीके से नहीं सोच सकता क्योंकि आपका एमवीसी ऐप वास्तव में एकमात्र चीज है जिसकी आपको आवश्यक संदर्भ तक पहुंच होगी। यह एक दिलचस्प समस्या है कि मैं एक कॉन्फ़िगरेशन फ़ाइल में हार्डकोड किए गए यूआरएल का उपयोग करने के साथ मिल रहा हूं जहां मैं आईडी के आधार पर प्रतिस्थापित करने के लिए '{0}' तर्क छोड़ देता हूं। समाधान को कभी पसंद नहीं आया इसलिए मुझे यह देखने में दिलचस्पी है कि ऐसा करने का एक बेहतर तरीका है या नहीं। – Kelsey

+0

कृपया ध्यान दें कि यह कोड अभी भी एमवीसी ऐप के अंदर चल रहा है - लेकिन किसी भी अनुरोध की सेवा नहीं कर रहा है। अगर मैं * किसी * अनुरोध को कैप्चर कर सकता हूं और UrlHelper इंस्टेंस को किसी ज्ञात स्थान पर संग्रहीत कर सकता हूं, तो समस्या हल हो जाएगी (हाँ, यह बहुत गंध करता है) – Marek

-2

आपको UrlHelper बनाने के लिए RequestContext की आवश्यकता है। मेरी HtmlHelper विस्तार तरीकों में से एक में, मैं इसे इस तरह कार्य करें:

public static string ScriptUrl(this HtmlHelper html, string script) 
{ 
    var url = new UrlHelper(html.ViewContext.RequestContext); 
    ... 
} 

आप RequestContext आपके आवेदन पर निर्भर है कैसे मिलता है।

+0

क्या आप कृपया निर्दिष्ट कर सकते हैं कि मैंने पोस्ट किए गए उदाहरण में HttpContext कैसे प्राप्त किया? समस्या मेरी मूल समस्या के बराबर प्रतीत होती है - मैं एमवीसी अनुरोध प्रसंस्करण पाइपलाइन के भीतर नहीं हूं, निर्धारित नौकरी क्वार्ट्ज शेड्यूलर से कहा जाता है। – Marek

+0

एमवीसी पाइपलाइन के बाहर, मुझे यकीन नहीं है। आपको शायद अपने मार्गों को मैन्युअल रूप से स्थापित करने की आवश्यकता होगी, क्योंकि ढांचा आपके लिए ऐसा नहीं कर रहा है। यह शायद संभव है, लेकिन परेशानी के लायक नहीं है। –

0

जब UrlHelper.Action विधि का उपयोग कर प्रोटोकॉल पैरामीटर निर्दिष्ट करने के लिए याद रखें, यह पूर्ण यूआरएल उत्पन्न होगा।उदाहरण:

url.Action("Action", "Controller", null, "http") 

या

url.Action("Action", "Controller", null, request.Url.Scheme)