2009-11-16 24 views
10

Temel bir küçük forumlar web uygulaması yazıyorum (eğlence için ve ole 'testere keskinleştirmek için) ve AppSettings ile biraz sorun yaşıyorum.AppSettings'i ASP.NET MVC Denetleyicisi ile Güncelleme

Planım, bu ayarları kendi dosyalarında (Settings.config) sahip olmak ve web işlemi kullanıcı hesabında izinler vermem ve bu dosyada tüm düzenlenebilir ayarları kaydetmem (ör. Forum başlığı, açıklama, vb).

Bu

benim kodudur:

 
[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"); 
    } 
} 

... ancak aşağıdaki hata döndürür çalışan: Ben ayarları dosyasına tüm kullanıcılara tam izin veren denedim

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

hiçbir etkisi olmadan (Şu anda sadece Cassini altında çalışıyorum, bu yüzden süreç kullanıcısı, dosyanın sahibi olan her durumda).

Herhangi bir fikrin var mı?

cevap

18
Buna ilk satırı değiştirin

: o olabilir

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

Kafa karıştırıcı olarak, OpenWebConfiguration Web.config bulunduğu sanal yol, dosya adı hariç bekliyor. Mantık, herhangi bir dizinde yalnızca bir Web.config olacağından, adın gereksiz olması gerektiği sanırım.sonuçta

MSDN documentation burada ipuçları bizi - Eğer örneklere bakarsak hepsi açık göreli yolları kullanın ve IIS altında barındıran zaman örneğin, diğer konumlardan yapılandırma dosyaları belirtmek için izin:

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

Ek:

Neden OpenWebConfiguration("~/Web.config") çalışıyor? Kesin olarak açıklayabildiğime emin değilim, ama bunu tekmeler için deneyin: ("~/Foo.bar")'a değiştirin. Aynı sonuç! - aynı Web.config dosyanızı - okuyamazsınız, ancak yazamazsınız! (şimdi foo.bar dizinini sitenize eklemeyi deneyin, sonra da içine bir Web.config yerleştirin ...)

OpenWebConfiguration bir dizin beklediğinden (ve bir Web bulduğu sürece görünüşe göre olmayanlara izin veriyor) .config ebeveynin içinde), sanırım yanlışlıkla ~/Web.config'i bir "yol" olarak belirtmemiz, root yapılandırmasını yüklememize izin veriyor, ancak kaydetmiyor.

+0

Bu aslında duymadığım çok ilginç bir davranış. Bunu açıklamak için çok teşekkür ederim, çünkü ben de bu konuda biraz klişeleşmiştim. – Venemo

+0

Teşekkür ederim, bu çok ilginç - Bu gece bu işi yapacağım! –

+1

Bir çekicilik gibi çalıştın - teşekkürler! –

0

Bunu başka bir projeden yürütüyorsanız, yapılandırma dosyasının bulunmadığı bu klasörden, bu nedenle oluşturulamayan bir hataya sahip olacaksınız.

Web klasörleri yapılandırma dosyasına ulaşmak için server.mappath veya bunun gibi bir şey kullanmak isteyebilirsiniz.

+0

"Bunu başka bir projeden yürütmek" ile neyi kastediyorsunuz? –

+0

Web sitenize sahipseniz ve söz konusu iş katmanınız varsa ve iş katmanı projesinde kod çalışıyorsa, aradığı yapılandırma dosyasının iş katmanı projesinde olacağından şüpheleniyorum. – griegs

+0

Ah, web yapılandırma dosyasına giden yolu görmeniz gerek ... Aslında hayır, normalde böyle şeyler ayarlarken, bu durumda tembel oluyorum ve "Modeller" klasöründe iş katmanı var MVC uygulamasının. –

1

bu deneyin:

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

Ancak, dinamik değiştirilmesi tasarlanıyor ise, Web.config içinde bu tür bilgileri depolamak için kötü bir fikir olduğunu düşünüyorum.

Ayrı bir yapılandırma dosyası kullanmayı planlıyor olsanız bile, bunu başka bir şekilde depolamayı tercih ederim ve System.Configuration sınıfları aracılığıyla kendi yapılandırmamı almayı tercih etmem. Çoğunlukla ASP.NET uygulamaları 'Web.Config ve Windows uygulamaları' App.Config okumak ve başka bir şeyle çalışmayı amaçlıyorlar gerçekten anlamsız.

projenize ayrı XML dosyası ekleyin:

aşağıdaki öneriyoruz. (tercihen, Web'den erişilemeyen App_Data klasörüne ve uygulamanızın zaten okuma ve yazma izinlerine sahip olduğu yere.)

Bu tür ayarları bu XML'de saklayabilir ve kolayca okuyabilir ve XML'ye System.Xml veya LINQ kullanarak yazabilirsiniz.

+0

Evet, bunu yapmanın en iyi yolu olmayabilir biliyorum - gerçekten sadece işe yarayıp yaramadığını görmek istedim ve farklı bir şey denemek istedim (ve eğer veri bankamda bir ayar tablosu oluşturmak için çok tembelti) dürüst;)) –

+1

@Venemo - Öneriniz çok anlamlı. Web.config tarafından uygulanan kısıtlamalar olmadan özgürce okuyabileceğimiz ve yazabileceğimiz bir XML dosyası kullanmak çok daha pratiktir. Ayrıca, okuma ve yazma haklarının zaten verildiği AppData'ya yerleştirme önerisini de beğendim. Sayısız uygulama tarafından paylaşılabileceğinden bahsetmek istemiyorum. Bu kadar uzağa gitmeyeceğim değil :) –

+0

@BenJunior - teşekkürler :) Yardım edebileceğime sevindim! – Venemo