Раздел "DbProviderFactories" может появляться только один раз для каждого файла конфигурации
Мы получаем эту ошибку при вызове службы WCF .net 4.0 с использованием структуры объекта.
The 'DbProviderFactories' section can only appear once per config file
Это первое приложение на сервере, использующее EF, и другие службы WCF .net 4.0 не получают эту ошибку.
Есть ли способ исправить эту ошибку без редактирования файла конфигурации машины на сервере?
4 ответа
Возможно, вы могли бы создать записи web.config, которые переопределяют любые общесистемные настройки, которые вы хотите изменить.
Описано здесь:
Переопределить machine.config с помощью web.config
Ввод <clear />
инструкция внутри DbProviderFactories
теги в веб-конфигурации, чтобы очистить, а затем переопределить дубликаты записей, сделанные в конфигурации компьютера. Таким образом, вы можете обойти ошибку в файле machine.config.
Установка для поставщика IBM DB2 .NET, вызывает пустую DbProviderFactories, см. Ниже. Просто удалите вторую пустую запись DbProviderFactories
<system.data>
<DbProviderFactories>
<add name="IBM DB2 for i .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for IBM i" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26" />
</DbProviderFactories>
<DbProviderFactories />
</system.data>
Вы должны обновить файл Machine.config, расположенный по нижеуказанным путям.
C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Machine.Config
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Machine.Config
Для 64-битных машин Machine.config будет расположен в ...\Framework64\...
Блок, на который следует обратить внимание:
<system.data>
<DbProviderFactories>
<add name="IBM DB2 for i5/OS .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for i5/OS" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26"/>
<add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</DbProviderFactories>
<!-- This is the line to remove - empty element --><DbProviderFactories/>
</system.data>
Как @yonsk уже упоминал, почему возникает эта проблема (повторяющаяся запись), вы можете создать консольное приложение, которое может исправить файл machine.config, а затем вызывать это консольное приложение из установщика вашего приложения или из вашего приложения всякий раз, когда вы получаете исключение. Следующий код можно использовать для консольного приложения, которое исправит файл machine.config.
class Program
{
static void Main()
{
string machineConfigFilePath = RuntimeEnvironment.SystemConfigurationFile;
XDocument xdoc = XDocument.Load(machineConfigFilePath);
XElement[] elements = xdoc.XPathSelectElements("//configuration/system.data/DbProviderFactories").ToArray();
if (elements.Any())
{
foreach (XElement anElement in elements)
{
if (!anElement.HasElements)
anElement.Remove();
}
}
xdoc.Save(machineConfigFilePath);
}
}
Если вы хотите вызвать консольное приложение из вашего Приложения, вам нужно будет вызвать его как Администратор. Таким образом, следующий фрагмент может помочь вызвать это консольное приложение от имени администратора (пользователю будет предложено диалоговое окно для принятия..)
try
{
Process process = Process.Start(new ProcessStartInfo
{
Verb = "runas",
FileName = "/Path/to/the/console/application",
UseShellExecute = true,
CreateNoWindow = true,
});
process.WaitForExit();
int exitCode = process.ExitCode;
}
catch (Exception ex)
{
}