2009-11-16 15 views
10

के माध्यम से ऐपसेटिंग अपडेट करना मैं एक बुनियादी छोटे मंच वेब ऐप लिख रहा हूं (मज़ेदार और ओले 'को तेज करने के लिए), और मुझे ऐपसेटिंग के साथ कुछ परेशानी हो रही है।एएसपी.नेट एमवीसी कंट्रोलर

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

यह मेरा कोड है:

 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(FormCollection collection) 
{ 
    try 
    { 
     var config = WebConfigurationManager.OpenWebConfiguration("~/Web.config"); 

     config.AppSettings.Settings["SiteTitle"].Value = collection["SiteTitle"]; 
     config.AppSettings.Settings["SiteDescription"].Value = collection["SiteDescription"]; 

     config.Save(ConfigurationSaveMode.Minimal, false); 
     ConfigurationManager.RefreshSection("appSettings"); 

     return RedirectToAction("Index"); 
    } 
    catch (Exception ex) 
    { 
     ModelState.AddModelError("_FORM", ex.Message); 
     return View("Index"); 
    } 
} 

... लेकिन यह निम्नलिखित त्रुटि देता चल:

A configuration file cannot be created for the requested Configuration object.

मैं सेटिंग्स फाइल करने के लिए सभी उपयोगकर्ताओं के लिए पूर्ण अनुमति प्रदान की कोशिश की है , बिना किसी प्रभाव के (मैं वर्तमान में सिर्फ कैसिनी के तहत चल रहा हूं, इसलिए प्रक्रिया उपयोगकर्ता वह है जिसकी फाइल किसी भी मामले में स्वामित्व है)।

कोई विचार?

उत्तर

18

इस के लिए अपना पहला लाइन बदलें:

var config = WebConfigurationManager.OpenWebConfiguration("~"); 

भ्रामक के रूप में यह हो सकता है, OpenWebConfiguration आभासी पथ जहाँ Web.config रहता है, फ़ाइल नाम को छोड़कर की उम्मीद है। मुझे लगता है कि तर्क यह है कि किसी दिए गए निर्देशिका में केवल एक Web.config होगा, जिसमें नाम अनावश्यक है।

MSDN documentation अंततः यहाँ में सुराग हमें - अगर आप उदाहरणों पर गौर वे सब स्पष्ट संबंधित पथ का उपयोग करें, और जब आईआईएस के तहत होस्टिंग उदाहरण के लिए, आप अन्य स्थानों से config फाइल को निर्दिष्ट कर सकते हैं:

OpenWebConfiguration("/siteName", "Default Web Site", null, "myServer"); 

अनुपूरक:

तो OpenWebConfiguration("~/Web.config") क्यों काम करता है? मुझे यकीन नहीं है कि मैं निश्चित रूप से इसे समझा सकता हूं, लेकिन इसे किक्स के लिए आज़माएं: इसे ("~/Foo.bar") पर बदलें। एक ही परिणाम! आप पढ़ सकते हैं - आपकी वही Web.config फ़ाइल - लेकिन लिख नहीं सकता! (अब अपनी साइट पर foo.bar निर्देशिका जोड़ने का प्रयास करें, फिर इसके अंदर एक Web.config डालें ...)

चूंकि ओपनवेब कॉन्फ़िगरेशन एक निर्देशिका की अपेक्षा करता है (और स्पष्ट रूप से मौजूद नहीं है, जब तक कि यह एक वेब पाता है माता-पिता के अंदर .config), मुझे लगता है कि यही कारण है कि गलती से ~/web.config को "पथ" के रूप में निर्दिष्ट करने से हम रूट कॉन्फ़िगर लोड कर सकते हैं, लेकिन इसे सहेज नहीं सकते हैं।

+0

यह वास्तव में एक बहुत ही रोचक व्यवहार है जिसके बारे में मैंने नहीं सुना है। इसे समझाने के लिए बहुत बहुत धन्यवाद क्योंकि मैं इसमें थोड़ा उलझन भी था। – Venemo

+0

धन्यवाद, यह बहुत रोचक है - मैं इसे आज रात जाऊंगा! –

+1

एक आकर्षण की तरह काम किया - धन्यवाद! –

0

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

आप वेब फ़ोल्डर्स कॉन्फ़िगरेशन फ़ाइल प्राप्त करने के लिए server.mappath या ऐसा कुछ उपयोग करना चाह सकते हैं।

+0

क्या आप स्पष्टीकरण दे सकते हैं कि "इसे किसी अन्य प्रोजेक्ट से चलाने" से क्या मतलब है? –

+0

यदि आपके पास अपनी वेबसाइट है और आपके पास व्यवसाय की परत है, और कोड बिजनेस लेयर प्रोजेक्ट में चल रहा है तो मुझे संदेह है कि कॉन्फ़िगरेशन फ़ाइल जो व्यवसाय की तलाश में है वह व्यवसाय परत प्रोजेक्ट में होगी। आपको वेब कॉन्फ़िगरेशन फ़ाइल – griegs

+0

आह का मार्ग प्राप्त करने की आवश्यकता है, मैं देखता हूं ... वास्तव में नहीं, जबकि मैं सामान्य रूप से चीजों को इस तरह सेट करता हूं, इस मामले में मैं आलसी हूं और "मॉडल" फ़ोल्डर में व्यवसाय परत है मेरे एमवीसी ऐप का। –

1

इस प्रयास करें:

var configFile = HttpContext.Current.Server.MapPath("~/Web.config"); 
var config = WebConfigurationManager.OpenWebConfiguration(configFile); 

हालांकि, मैं विशेष रूप से अगर यह गतिशील बदला जा करने का इरादा है लगता है, यह एक बुरा विचार web.config में इस प्रकार की जानकारी स्टोर करने के लिए है।

भले ही आप एक अलग कॉन्फ़िगरेशन फ़ाइल का उपयोग करने की योजना बना रहे हों, फिर भी मैं इसे किसी अन्य तरीके से स्टोर करूंगा, और मैं सिस्टम के माध्यम से अपना स्वयं का कॉन्फ़िगरेशन प्राप्त करने के लिए परेशान नहीं होगा। कॉन्फ़िगरेशन की कक्षाएं। वे ज्यादातर एएसपी.नेट एप्स के वेब को पढ़ने के लिए हैं। कॉनफिग और विंडोज ऐप 'ऐप। कॉनफिग, और उन्हें किसी और चीज़ के साथ काम करना वास्तव में व्यर्थ है।

अपनी परियोजना के लिए एक अलग एक्सएमएल फ़ाइल जोड़ें:

मैं निम्नलिखित सलाह देते हैं। (अधिमानतः ऐप_Data फ़ोल्डर में, जहां इसे वेब से एक्सेस नहीं किया जा सकता है, और जहां आपका एप्लिकेशन पहले ही पढ़ चुका है और अनुमतियां लिखता है।)

फिर आप उस XML में इस तरह की सेटिंग्स को स्टोर कर सकते हैं, और आसानी से पढ़ सकते हैं और System.Xml या LINQ से एक्सएमएल का उपयोग करके इसे लिखें।

+0

हाँ, मुझे पता है कि यह करने का सबसे अच्छा तरीका नहीं हो सकता है - मैं वास्तव में यह देखना चाहता था कि यह काम करता है या नहीं, और कुछ अलग करने की कोशिश करें (और मेरे डेटाबेस में सेटिंग्स तालिका सेट अप करने के लिए बहुत आलसी था, अगर मैं हूं ईमानदार;)) –

+1

@ वेनेमो - आपका सुझाव बहुत समझ में आता है। यह एक XML फ़ाइल का उपयोग करने के लिए और अधिक व्यावहारिक है जहां हम web.config द्वारा लगाए गए प्रतिबंधों के बिना स्वतंत्र रूप से पढ़ और लिख सकते हैं। मुझे इसे ऐपडाटा में रखने का सुझाव भी पसंद आया जहां पढ़ने और लिखने के अधिकार पहले से ही दिए गए हैं। उल्लेख करने के लिए नहीं कि इसे अनगिनत ऐप्स द्वारा साझा किया जा सकता है। ऐसा नहीं है कि मैं अब तक जाऊंगा :) –

+0

@ बेनजुनियर - धन्यवाद :) मुझे खुशी है कि मैं मदद कर सकता हूं! – Venemo

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