2009-01-16 26 views
14

¡Estoy atascado! esto parece realmente tonto, pero no puedo ver dónde me estoy equivocando. Estoy creando un sitio web 2.0 C# ASP.NET. Estoy tratando de utilizar una sección personalizada en el archivo web.config con:C# ConfigurationManager.GetSection no pudo cargar el archivo o el ensamblaje

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

que tienen una DLL separada para los objetos que se encuentran en Bailey.DataLayer espacio de nombres. Pero cuando corro la página test.aspx me sale el siguiente error:

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" 

La clase que yo estoy tratando de conseguir es el siguiente: el archivo de configuración

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

La web tiene esta sección:

<configSections> 
    <section name="DatabaseFactoryConfiguration" 
      type="Bailey.DataLayer.DatabaseFactorySectionHandler, Bailey.DataLayer" /> 
</configSections> 

He hecho esto en una aplicación de consola sin ningún problema, pero no veo ninguna diferencia aparte de estar en una página web.

EDITAR

Todo se compila y lanza el error en tiempo de ejecución por lo que sólo puedo asumir que encontrar el montaje porque se hace referencia en la página test.aspx.cs.

tengo la siguiente instrucción using en la parte superior de la página test.aspx.cs:

using Bailey.DataLayer; 

Aquí es todo el archivo web.config para que no haya confusión:

<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

¿Dónde está la propia sección de configuración personalizada? –

+0

Bueno, ahí está tu problema ... En realidad, no tienes la sección personalizada. –

+0

Está allí, pero no puedo obtener el XML del archivo de configuración para mostrarlo correctamente, o ¡ahora mismo! – Jon

Respuesta

25

O se está utilizando el nombre incorrecto (es decir, no se le llama Bailey.DataLayer.dll), o es que no se copia en el directorio bin en construcción. Sin embargo, este último no parece probable.

(Consulte mis comentarios sobre la pregunta para obtener aclaraciones).

+5

¡Gracias Andrew! Hizo clic. El nombre de la DLL no estaba siendo referenciado en la configuración web. No me di cuenta de que era el DLL real que tuve que poner, pensé que era solo el espacio de nombres. – Jon

+0

aquí http://msdn.microsoft.com/en-en/library/2tw134k3.aspx describió el proceso de creación de la sección de configuración. Y hay una cosa ese ensamblado con sección debe estar en el mismo nivel que webconfig donde quiera usarlo, como es: Incluya el ensamblado que define la sección en el mismo directorio que el archivo Web.config. –

4

Necesita dos entradas en el archivo de configuración, una en el elemento configSections para declarar la sección de configuración personalizada, y otra, la propia sección de configuración personalizada. ¿Agregaste ambos?

por ejemplo:

<?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

Hola Charles, he editado mi publicación para tratar de mostrar todo el archivo de configuración (no se muestra correctamente atm. Pero creo que es correcto. No sabía acerca de DictionarySectionHandler que es genial y algo que usaré en el futuro. thx – Jon

+0

+1 para el consejo sobre System.Configuration.DictionarySectionHandler - ¡Hizo las cosas MUCHO MÁS FÁCIL para mí! – paulH

4

Ok ... Tuve el mismo problema. Ninguna de las soluciones anteriores ayudó. En mi caso, mi archivo de configuración estaba en el mismo archivo DLL que el de web.config. Simplemente eliminé el espacio de nombres de la sección de configuración y eso solucionó mi problema.

No funciona

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

Trabajo

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

Tan pronto como me quita el espacio de nombres , ProjectName.ClientApi.Filters comenzó a funcionar.

Cuestiones relacionadas