Soru ASP.NET özel yapılandırma bölümü bildirim bildirimleri IIS Yöneticisi Yapılandırma Düzenleyicisi


ASP.NET 2.0 (web projesi .NET Framework 3.5) web uygulamasının özel bir yapılandırma grubu ve bölümünü belirtmemi sağlayan basit bir .NET özel yapılandırma bileşenim var. web.config dosya:

Benim .. De web.config Aşağıdaki beyanlarım var:

<configuration>

  <configSections>
    <sectionGroup 
      name="SimpleConfigGroup"
      type="CustomSettingsLib.SimpleConfigGroup, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9">
      <section 
        name="SimpleConfigSection"
        type="CustomSettingsLib.SimpleConfigSection, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9"/>
    </sectionGroup>
  </configSections>

  <SimpleConfigGroup>
    <SimpleConfigSection MySetting="Hello World" />
  </SimpleConfigGroup>

</configuration>

Adında bir sınıf kütüphanesi projesinde yer alan bu özel yapılandırma bölümüne erişim sağlayan birkaç sınıf vardır. CustomSettingsLib:

SimpleConfigGroup.cs:

using System.Configuration;
namespace CustomSettingsLib
{
  public class SimpleConfigGroup : ConfigurationSectionGroup
  {
    [ConfigurationProperty("SimpleConfigSection")]
    public SimpleConfigSection SimpleConfigSection
    {
      get { return (SimpleConfigSection)this.Sections["SimpleConfigSection"]; }
    }
  }
}

SimpleConfigSection.cs:

using System.Configuration;
namespace CustomSettingsLib
{
  public class SimpleConfigSection : ConfigurationSection
  {
    [ConfigurationProperty("MySetting", IsRequired = false)]
    public string MySetting
    {
      get { return (string)this["MySetting"]; }
    }
  }
}

Okumak için kod MySetting değer gibi görünüyorDefault.aspx.cs):

using System;
using System.Configuration;
using System.Web.Configuration;
using CustomSettingsLib;

namespace WebApplication4
{
  public partial class Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
      SimpleConfigGroup group = 
              config.GetSectionGroup("SimpleConfigGroup") as SimpleConfigGroup;
      SimpleConfigSection section = group.SimpleConfigSection;
      Response.Write(section.MySetting);
    }
  }
}

Bu harika çalışıyor ve web uygulamamı okuyabilir MySetting benim değerinden web.config dosya.

Bu ayarlar, Windows 2008 R2 + IIS7.5'deki birçok web uygulamasında kullanıldıklarından IIS Yapılandırması Şeması uzantısı Bu ayarın, düzenleme yapmak zorunda kalmadan IIS Yöneticisi'nin Yapılandırma Düzenleyicisi özelliğinde düzenlenmesine izin vermek için web.config dosya.

Bir IIS yapılandırma şeması uzantısı dosyası ekledim:

%systemroot%\system32\inetsrv\config\schema

<configSchema>
  <sectionSchema name="SimpleConfigGroup">
    <element name="SimpleConfigSection">
      <attribute name="MySetting" 
                 type="string" 
                 validationType="nonEmptyString" />
    </element>
  </sectionSchema>
</configSchema>

Daha sonra IIS'nin aşağıdaki bölüm tanımını ekledim applicationHost.config dosyada <configSections> öğe:

<section name="SimpleConfigGroup" 
         overrideModeDefault="Allow" 
         allowDefinition="Everywhere" />

Sahip olduğum sorun, site için IIS Yöneticisi'nin Yapılandırma Düzenleyicisi'ni açtığımda:

enter image description here

Sonra seç SimpleConfigGroup aşağı açılan listeden aşağıdaki belirsiz hatayı bildirir:

"Gerçekleştirirken bir hata oluştu   bu operasyon."
  Detaylar:
  Dosya adı:   ? \ \ E: \ siteleri \ site1 web.config \
  Hata:

İşte bu hatanın ekran görüntüsü:

enter image description here

.NET'i kaldırırsam <sectionGroup> siteden beyan web.config dosya IIS Yöneticisi'nin Yapılandırma Düzenleyicisi'ni kullanarak özel ayarları güzelce düzenleyebilirim. Ancak web uygulamam <sectionGroup> Özel yapılandırma bölümü için yapılandırma bilgisi gereklidir ve .NET'in ayrıştırılabilmesi için. web.config dosya.

Ekleyerek denedim <sectionGroup> köke machine.config (ve hatta yapılandırma derlemesini .NET 2.0 çerçeve derlemeleri klasörüne bırakarak) ama aynı hatayı alıyorum. Ayrıca, yapılandırma derlemesinin bir güven sorunu olabileceğini düşünerek imzalamayı denedim, ancak bu da işe yaramadı.

Garip bulduklarım, her zamanki .NET Framework'dür. <configSections> içinde machine.config IIS Yöneticisi Yapılandırma Yöneticisi'ni üzme, .NET 3.5 System.Web.Extensions <sectionGroup> ASP.NET 2.0 sitesindeki tanımlar, ör. için system.web henüz özel yapılandırma bölümlerim var.

Bu neden? IIS Yöneticisi Yapılandırma Düzenleyicisi'nde bir hata mı?

Güncelleştirme:

Scott'ın önerisine dayanarak aşağıdakileri ekledim: applicationHost.config dosya bırakarak sectionGroup/section beyanında web.config dosya:

<sectionGroup name="SimpleConfigGroup">
  <section name="SimpleConfigSection" 
           allowDefinition="Everywhere" 
           overrideModeDefault="Allow" />
</sectionGroup>

Bu, daha önce tanımlandığı için anlaşılabilir olan aşağıdaki hatayı oluşturur. web.config dosya:

enter image description here


Kaldırmayı denedim sectionGroup/section beyanı web.config ama yukarıda tutmak sectionGroup beyanname applicationHost. IIS Yöneticisi Yapılandırma Düzenleyicisi artık listelenmiyor SimpleConfigGroupBölüm.


Sonra bunu denedim applicationHost.config:

<section 
    name="SimpleConfigGroup" 
    allowDefinition="Everywhere" 
    overrideModeDefault="Allow" 
    type="CustomSettingsLib.SimpleConfigGroup, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9"/>

IIS Yöneticisi'nin Yapılandırma Ayarları düzenleyicisi, artık bölümü hatasız olarak yeniden görebilir, ancak bölüm bildirimi olmadığından web.config ASP.NET uygulaması bir atar "Tanınmayan yapılandırma bölümü" istisna.


Bunu da denedim applicationHost.config:

<sectionGroup 
   name="SimpleConfigGroup" 
   type="CustomSettingsLib.SimpleConfigGroup, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9">
  <section 
    name="SimpleConfigSection" 
    overrideModeDefault="Allow" 
    allowDefinition="Everywhere"
    type="CustomSettingsLib.SimpleConfigSection, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9"/>
</sectionGroup>

Yine, hiçbir zar, ASP.NET bir atar "Tanınmayan yapılandırma bölümü" istisna ve IIS Yöneticisi Yapılandırma Düzenleyicisi artık listelenmiyor SimpleConfigGroupBölüm.


İlerleme:

İlk üsse geri döndüm ve yeniden web.config ASP.NET uygulamasının özel yapılandırma değerlerini okuyabilmesi için yapılandırma bölümü bildirimi. Müşteri şema dosyasını IIS şema klasöründen sildim ve geri döndü applicationHost.config'ler configSections fabrika ayarlarına geri dönün.

İlginç bulduğum şeylerden biri, IIS Yöneticisinin yapılandırma düzenleyicisinin ortaya çıkmasıdır. system.web ayarları ve bunun için bir şema dosyası varken (ASPNET_schema.xml) şema bölümleri aslında başvurulan değil applicationHost.config dosya. Bu bana bu dosyaların ya da sectionSchema isimler özel bir şekilde ele alınmaktadır.

Bunun için kilidi açtım. ASPNET_schema.xml dosya ve şema tanımımı ekledim:

<sectionSchema name="SimpleConfigGroup">
  <element name="SimpleConfigSection">
    <attribute name="MySetting" 
                     type="string" 
                     validationType="nonEmptyString" />
  </element>
</sectionSchema>

Bu işe yaramadı ve SimpleConfigGroup IIS Yöneticisinin Yapılandırma Düzenleyicisi'nde görünmedi. Ancak hiçbir hata atılmadı ve ASP.NET uygulaması hala özel yapılandırma değerlerini okuyabildi.

Daha sonra kullanılan konvansiyonları takip etmeyi denedim. ASPNET_schema.xml şema dosyası ve bunun yerine şunu ekledik:

<sectionSchema name="SimpleConfigGroup/SimpleConfigSection">
  <attribute name="MySetting" 
             type="string" 
             validationType="nonEmptyString" />
</sectionSchema>

Bu gerçekten işe yaradı !:

enter image description here

ASP.NET uygulaması çalışmaya devam eder ve özel yapılandırma bölümünü okuyabilir VE özel yapılandırma bölümünü düzenleyebilirim MySetting IIS Yöneticisinin Yapılandırma Düzenleyicisi'nde değer.

Ben daha sonra haddelenmiş ASPNET_schema.xml fabrika ayarlarına dönüp, özel olarak yeniden oluşturmayı denedik SimpleConfigSchema.xml Aynı tanım kullanılarak IIS'nin şema klasöründe dosya ve bu da çalışır.

Bu ayrıca olmadan içindeki yapılandırma bölümüne bir referans ekleme applicationHost.config.

Ben hem IIS Yöneticisinin yapılandırma editörü AND ASP.NET'in aynı bölümü tüketmesi gereken şemayı genişletme yönündeki rehberin biraz aldatıcı olduğu sonucuna varıyorum.


5
2018-05-08 23:07


Menşei


ayrıntılı yazı için teşekkürler. Küçük soru, programsal olarak eklemek için bir yol var mı <configSection> için applicationHost.config dosyayı el ile düzenlemek zorunda kalmadan? denedim appcmd.exe set config ... ama kesin komutu anlayamıyorum - Amro
boşver, diğer cevabında sadece cevabı buldum: stackoverflow.com/questions/5750213/... . Başka bir yararlı betik: troyparsons.com/blog/2012/10/... - Amro


Cevaplar:


Selam Kev. Bu, örneklerinizi kullanarak hemen benim için çalıştı. İşte herşeyi yerleştirdiğim yer:

Yol:

%systemroot%\system32\inetsrv\config\schema\simpleconfig.xml

İçerik:

<configSchema>
  <sectionSchema name="SimpleConfigGroup">
    <element name="SimpleConfigSection">
      <attribute name="MySetting" 
                 type="string" 
                 validationType="nonEmptyString" />
    </element>
  </sectionSchema>
</configSchema>

Yol:

%systemroot%\system32\inetsrv\config\applicationHost.config (in <configSections> element).

İçerik:

<section name="SimpleConfigGroup" 
         overrideModeDefault="Allow" 
         allowDefinition="Everywhere" />

Yol:

Site's web.config

İçerik:

  <SimpleConfigGroup>
    <SimpleConfigSection MySetting="Hello World" />
  </SimpleConfigGroup>

3
2018-05-09 14:29



Sağol Scott. Beynimi bu konuda yeniyorum :) - Kev
Merhaba Scott, şuna baktığın için teşekkürler: Biliyorum, bu kolay bit ve iyi çalışıyor. Ama ben eklediğimde /configuration/configSections/sectionGroup ve /configuration/configSections/sectionGroup/section beyanları web.config Böylece, .NET özel yapılandırma XML'i ayrıştırabiliyor, bu da IIS Yöneticisinin Yapılandırma Düzenleyicisi'ni kırıyor gibi görünüyor. Soruyu tekrar sordum ve biraz daha ayrıntı ekledim. - Kev
Açıklamanızı anlarsam, sorunun <configSection> uygulamasının yalnızca applicationHost.config dosyasında ve başka bir yerde olmaması gerektiğine inanıyorum. Temel olarak a) şema klasöründeki şemaya ve b) applicationHost.config dosyasındaki bölüm bildirimine ve ardından c) 'ye ihtiyacınız vardır. sadece Sitenizin web.config dosyasındaki <SimpleConfigGroup> bölümü. - Scott Forsyth - MVP
Merhaba Scott .... çözüldü! Ayrıca, ASP.NET tarafından tüketilmek üzere tasarlanan şema uzantılarını tanımlama yönündeki MS kılavuzunun biraz yanlış olduğunu düşünüyorum. Güncellemeye bakın. - Kev
Mükemmel, çalışan bir çözüm aldığına sevindim. Yapılandırmayı etkinleştirmiş olmanız ve applicationHost.config öğesinin% windir% \ system32 \ inetsrv \ config klasöründen olma şansınız yok mu? Neredeyse o dosyaya uygulanan ayarlarınız alınmıyor gibi görünüyor. Uygulama havuzu oluşturulduğunda alındıklarından, bunları uyguladıktan sonra bir iisreset yapmanız gerekebilir. Çözümünüz, sitenin web.config dosyasındaki yapılandırmayı kullanır. Bu da iyi bir çalışma çözümüdür. - Scott Forsyth - MVP