2009-04-28 10 views
7

संपत्ति HttpContext.Current.Request.ApplicationPath आईआईएस या WebDev.WebServer में वर्चुअल निर्देशिका का प्रतिनिधित्व करता है।क्या मैं global.asax.cs में वर्चुअल निर्देशिका नाम का उपयोग कर सकता हूं?

HttpContext.Current.Request.ApplicationPath evaluates to "/virtualdirectory" 

यह एक पथ जड़ रिश्तेदार बनाने के लिए VirtualPathUtility साथ संयोजन के रूप में इस्तेमाल किया जा सकता है:

VirtualPathUtility.ToAbsolute("~/images/cat.jpg", 
           HttpContext.Current.Request.ApplicationPath) 

// (this evaluates to "/virtualdirectory/images/cat.jpg") 

IIS6 में और अनुरोध वस्तु WebDev.WebServer global.asax.cs में उपलब्ध है, लेकिन IIS7 शिकायत यह है कि 'वर्तमान संदर्भ में उपलब्ध नहीं है'। इसलिए उपरोक्त कोड की दूसरी पंक्ति आईआईएस 7 में काम नहीं करती है।

समस्या मुझे वर्चुअल डायरेक्ट्रॉय नाम को global.asax.cs के भीतर एक्सेस करने की आवश्यकता है। मुझे कुछ पथ बनाने के लिए इसकी आवश्यकता है जो गतिशील रूप से बनाए गए सीएसएस में उपयोग किए जाते हैं। क्या इस मूल्य तक पहुंचने का कोई वैकल्पिक तरीका है?

संपादित करें: यह आपको Application_Start तहत global.asax.cs में HttpContext.Current.Request फोन करने के लिए आईआईएस 7 में प्राप्त होने वाले त्रुटि है:

HttpException (0x80004005): Request is not available in this context] 
    System.Web.HttpContext.get_Request() +8789264 
+0

मुझे सवाल नहीं पता है, HttpContext.Current global.asax में उपलब्ध है, क्या आप क्या घटना पूछ रहे हैं? –

+0

@deviant - HttpContext.Current उपलब्ध है, लेकिन HttpContext.Current.Request नहीं है। मैंने –

उत्तर

13

अंत में इसका सरल उत्तर मिल गया!

HttpRuntime.AppDomainAppVirtualPath 

उपलब्ध तुरंत Application_Start

दौरान यह फार्म /myapplication/ उपसर्ग शामिल करने की है।

+0

पूर्ण निर्देशिका नाम कैसे प्राप्त करें? –

+1

समझ गया! HttpRuntime.AppDomainAppPath –

+1

आप महोदय, श्रीमान साइमन वीवर, आपको यह मिल गया। – Jimbo

0

आप ResolveUrl उपयोग कर सकते हैं ("~/images/cat.jpg") अपना रास्ता बनाने के लिए?

संपादित करें: ResolveUrl, नियंत्रण, न सिर्फ पृष्ठ वर्ग की एक विधि है, तो आप इसे बजाय इस तरह से (बिट बदसूरत हो सकता है) कर सकते हैं:

System.Web.UI.Control c = new Control(); 
String s = c.ResolveUrl(@"~/images/cat.jpg"); 
+0

त्रुटि को शामिल करने के लिए पोस्ट संपादित किया है क्योंकि पृष्ठ –

0

हममम ... मैं नहीं था आईआईएस 7 परिवर्तन के बारे में पता है। मुझे आश्चर्य है कि इस ऑपरेशन को तब तक स्थगित करना आसान नहीं होगा जब तक कि आप को कोई पृष्ठ प्राप्त न करें। उदाहरण के लिए, आप Application_BeginRequest या Session_Start में "केवल एक बार" डालने का प्रयास कर सकते हैं?

या (पूरी तरह से अपरीक्षित) एक आत्म सदस्यता त्यागने की हुक के लिए:

public override void Init() { 
     base.Init(); 
     EventHandler handler = null; 
     handler = delegate { 
      // do stuff, once only 
      this.BeginRequest -= handler; 
     }; 
     this.BeginRequest += handler; 
    } 

चाल यह एक बार ही (एक ही बार में अगर एक से अधिक अनुरोध आने) कर रही है; शायद एक स्थिर ctor? उदाहरण के लिए, मैं इस एक बार ही आग लगता है, और केवल जब वहाँ एक पृष्ठ संदर्भ में उपलब्ध है: Application_BeginRequest (निशान) के माध्यम से

मैं asax इसलिए का उपयोग करें:

static class DelayedLoader { 
     static DelayedLoader() { 
      string s = VirtualPathUtility.ToAbsolute("~/images/cat.jpg", 
          HttpContext.Current.Request.ApplicationPath); 
     } 
     [MethodImpl(MethodImplOptions.NoInlining)] 
     public static void Init() { } 
    } 
    public override void Init() { 
     base.Init(); 
     EventHandler handler = null; 
     handler = delegate { 
      DelayedLoader.Init(); 
      this.BeginRequest -= handler; 
     }; 
     this.BeginRequest += handler; 
    } 
+0

का कोई उदाहरण नहीं है Application_BeginRequest शायद सबसे सुरक्षित है। मुझे सत्र_स्टार्ट की जीवनशैली के बारे में निश्चित नहीं है, लेकिन जब मैंने इसका उपयोग करने की कोशिश की तो पेज आउटपुट दूषित हो गया - मुझे लगता है कि यह मेरे संपीड़न के साथ विवादित है - जो बहुत अजीब है लेकिन मैं अब –

0

यह सबसे अच्छा मैं के साथ आया है शायद ही कभी मैं अस्थायी रूप से भूल गया था कि आप इसके साथ अलग-अलग कार्यक्रम प्राप्त करते हैं। अब तक मैं Application_Start में सीएसएस स्प्राइट्स बना रहा हूं। इसे BeginRequest में ले जाना सबसे अच्छा था जिसके साथ मैं आ सकता था।

प्रत्येक अनुरोध के लिए एक बूलियन चेक नगण्य है, लेकिन अगर कोई अलग तरीका है तो अच्छा होगा।

protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 

    protected void Application_BeginRequest() 
    { 
     if (!_initialized) 
     { 
      lock (thisLock) 
      { 
       _initialized = true; 
       GenerateCSSSprites(); 
      } 
     } 
    } 
+0

के लिए Begin_Request के साथ रहूंगा ध्यान दें कि यह लगता है कि दो जेनरेट सीएसएसप्रिएंट्स को दो बार पर्याप्त रूप से पर्याप्त रूप से आने पर सैद्धांतिक रूप से संभव लगता है। असंभव है, लेकिन ... आप डबल-चेक किए गए लॉकिंग का उपयोग करना चाहेंगे (यानी लॉक के अंदर भी शुरू किया गया है), या एक और दृष्टिकोण (जैसे स्थैतिक सीटीआर चाल)। –

+0

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

+0

जब मैंने मूल रूप से कोशिश की तो यह वास्तव में दो बार चलाया गया: GenerateCSSSprites(); _initialized = सच। यह थोड़ा डरावना है क्योंकि मैं पृष्ठ पर एकमात्र व्यक्ति हूं और भले ही मैं उस होस्ट पर कई संसाधनों तक पहुंच रहा हूं, ब्राउज़र पहले अनुरोध के बाद तक उनसे पूछ नहीं सकता है - इसलिए आईआईएस 7 एक से अधिक छद्म बनाना चाहिए 'मेरे एक असली अनुरोध के लिए अनुरोध। wierd –

0

मैं भी इस समस्या थी जब IIS7 का उपयोग करने जा, लेकिन मैं अनुरोध के लिए की जरूरत बाहर refactor करने के लिए कर रहा था। यदि आप यह नहीं कर सकते तो यह लड़का भी सुझाव देता है और एक वर्कअराउंड प्रदान करता है।

http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx

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

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