2009-01-16 13 views
14

Ich stecke fest! das scheint wirklich dämlich, aber ich kann nicht sehen, wo ich falsch liege. Ich erstelle eine 2.0 C# ASP.NET-Website. Ich versuche, einen benutzerdefinierten Abschnitt in der web.config-Datei zu verwenden mit:C# ConfigurationManager.GetSection konnte Datei oder Baugruppe nicht laden

DatabaseFactorySectionHandler sectionHandler = ConfigurationManager.GetSection("DatabaseFactoryConfiguration") as DatabaseFactorySectionHandler; 

Ich habe eine separate DLL für die Objekte, die in Bailey.DataLayer Namensraum sind. Aber wenn ich die test.aspx Seite laufen bekomme ich folgende Fehlermeldung:

System.Configuration.ConfigurationErrorsException was unhandled by user code 

Message="An error occurred creating the configuration section handler for DatabaseFactoryConfiguration: Could not load file or assembly 'Bailey.DataLayer' or one of its dependencies. The system cannot find the file specified. (C:\\Documents and Settings\\Administrator.PIP\\My Documents\\Visual Studio 2005\\WebSites\\bailey\\web.config line 13)" 
Source="System.Configuration" 

Die Klasse, die ich zu bekommen habe versucht, sich wie folgt:

namespace Bailey.DataLayer 
{ 
    public sealed class DatabaseFactorySectionHandler : ConfigurationSection 
    { 
     [ConfigurationProperty("Name")] 
     public string Name 
     { 
      get { return (string)base["Name"]; } 
     } 

     [ConfigurationProperty("ConnectionStringName")] 
     public string ConnectionStringName 
     { 
      get { return (string)base["ConnectionStringName"]; } 
     } 

     public string ConnectionString 
     { 
      get 
      { 
       try 
       { 
        return ConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString; 
       } 
       catch (Exception excep) 
       { 
        throw new Exception("Connection string " + ConnectionStringName + 
             " was not found in web.config. " + 
             excep.Message); 
       } 
      } 
     } 
    } 
} 

Die Web-Konfigurationsdatei hat diesen Abschnitt:

Ich habe dies in einer Konsolen-App ohne ein Problem gemacht, aber kann keine Unterschiede sehen, abgesehen davon, dass es in einer Webseite ist.

EDIT

Es alle compiliert und den Fehler zur Laufzeit wirft, damit ich sie nur die Montage finden nehmen kann, weil sie in der test.aspx.cs Seite verwiesen wird.

Ich habe die folgende Anweisung am Anfang der Seite test.aspx.cs mit:

<configuration> 
    <configSections> 
     <section name="DatabaseFactoryConfiguration" type="Bailey.DataLayer.DatabaseFactorySectionHandler, Bailey.DataLayer" /> 
    </configSections> 
    <appSettings/> 
    <connectionStrings> 
     <add name="BaileyMDFConString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\bailey.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <DatabaseFactoryConfiguration Name="System.Data.SqlClient" ConnectionStringName="BaileyMDFConString" /> 
    <system.web>   
     <compilation debug="true"/>  
     <authentication mode="Windows"/> 
    </system.web> 
</configuration> 
+0

Wo ist der eigentliche benutzerdefinierte Konfigurationsabschnitt selbst? –

+0

Nun, da ist dein Problem ... Du hast eigentlich keinen benutzerdefinierten Bereich. –

+0

Es ist da, aber ich kann nicht das XML aus der Konfigurationsdatei korrekt oder überhaupt nicht angezeigt bekommen! – Jon

Antwort

25

Entweder Sie den falschen Namen verwenden (das heißt es ist nicht Bailey.DataLayer.dll genannt), oder es wird nicht in das Verzeichnis ist auf Build kopiert werden. Letzteres scheint jedoch nicht wahrscheinlich.

(Siehe meine Kommentare zur Klärung der Frage).

+5

Vielen Dank Andrew! Es geklickt. Der DLL-Name wurde nicht in der Web-Konfiguration referenziert. Ich habe nicht realisiert, dass es war die eigentliche DLL musste ich setzen, ich dachte, es wäre nur der Name Raum. – Jon

+0

hier http://msdn.microsoft.com/en-en/library/2tw134k3.aspx beschrieben Prozess der Erstellung der Konfiguration Abschnitt. Und es gibt eine Sache Diese Assembly mit Abschnitt sollte sich auf der gleichen Ebene wie webconfig befinden, wo Sie sie verwenden möchten: Fügen Sie die Assembly hinzu, die den Abschnitt im selben Verzeichnis wie die Datei Web.config definiert. –

4

:

using Bailey.DataLayer; 

Hier ist die ganze Datei web.config, so gibt es keine Verwirrung Sie benötigen zwei Einträge in der Konfigurationsdatei, eine im configSections-Element, um den benutzerdefinierten Konfigurationsabschnitt zu deklarieren, und eine weitere - den eigentlichen benutzerdefinierten Konfigurationsabschnitt selbst. Hast du beides hinzugefügt?

zum Beispiel:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <configSections> 
    **<section name="Connections" 
      type="System.Configuration.DictionarySectionHandler" />** 
    </configSections> 

    <Connections 
     <add key="myServer" value="serverName" /> 
     <add key="myPort" value="8080" /> 
     <add key="myURI" value="RequestUri" /> 
     <add key="UserId" value="joebob" /> 
     <add key="password" value="$^%^&%$^&@%" />   
    /> 

</configuration> 
+0

Hallo Charles, ich habe meinen Post bearbeitet, um zu versuchen, die ganze Konfigurationsdatei anzuzeigen (nicht korrekt angezeigt atm. Aber ich glaube, dass es korrekt ist. Ich wusste nicht über den DictionarySectionHandler was cool ist und etwas, das ich in der Zukunft verwenden werde. thx – Jon

+0

+1 für den Tipp über System.Configuration.DictionarySectionHandler - Dinge so viel einfacher für mich! – paulH

4

Ok ... Ich hatte das gleiche Problem. Keine der obigen Lösungen half. In meinem Fall war meine Konfigurationsdatei in derselben DLL wie die von web.config. Ich habe einfach den Namespace aus dem Konfigurationsbereich entfernt, und dadurch wurde mein Problem behoben.

Nicht

<configSections> 
<section name="authorizedServerSection" type="ProjectName.ClientApi.Filters.AuthorizedServerSection, ProjectName.ClientApi.Filters" requirePermission="false"/> 

Arbeits

<configSections> 
<section name="authorizedServerSection" type="ProjectName.ClientApi.Filters.AuthorizedServerSection" requirePermission="false"/> 

arbeiten Sobald ich den Namespace entferntEs fing an zu arbeiten.