C # ConfigurationManager.GetSection не удалось загрузить файл или сборку - PullRequest
14 голосов
/ 17 января 2009

Я застрял! это кажется действительно глупым, но я не могу видеть, где я иду не так. Я создаю 2.0 C # ASP.NET веб-сайт. Я пытаюсь использовать пользовательский раздел в файле web.config с:

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

У меня есть отдельная DLL для объектов, которые находятся в пространстве имен Bailey.DataLayer. Но когда я запускаю страницу test.aspx, я получаю следующую ошибку:

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"

Класс, который я пытаюсь получить, выглядит следующим образом:

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

Файл веб-конфигурации имеет этот раздел:

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

Я сделал это в консольном приложении без проблем, но не вижу никаких отличий, кроме того, что он находится на веб-странице.

EDIT

Все это компилируется и выдает ошибку во время выполнения, поэтому я могу только предположить, что она находит сборку, поскольку на нее есть ссылка на странице test.aspx.cs.

В верхней части страницы test.aspx.cs есть следующий оператор using:

using Bailey.DataLayer;

Вот весь файл web.config, поэтому нет путаницы:

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

Ответы [ 4 ]

25 голосов
/ 17 января 2009

Либо вы используете неправильное имя (т.е. оно не называется Bailey.DataLayer.dll), либо оно не копируется в каталог bin при сборке. Впрочем, последнее не похоже.

(см. Мои комментарии к вопросу для уточнения).

6 голосов
/ 18 июня 2014

Хорошо ... У меня была такая же проблема. Ни одно из вышеперечисленных решений не помогло. В моем случае мой конфигурационный файл находился в той же DLL, что и файл web.config. Я просто удалил пространство имен из раздела конфигурации, и это решило мою проблему.

Не работает

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

Рабочая

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

Как только я удалил пространство имен , ProjectName.ClientApi.Filters, оно начало работать.

4 голосов
/ 17 января 2009

Вам нужно две записи в файле конфигурации, одна в элементе configSections, чтобы объявить пользовательский раздел конфигурации, а другая - сам фактический пользовательский раздел конфигурации. Вы добавили оба?

например:

<?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 голосов
/ 03 февраля 2009

Возможно, вы захотите взглянуть на http://www.primaryobjects.com/CMS/Article81.aspx, который содержит почти строку за строкой код, который вы показали выше, включая пример из файла web.config.

...