2012-12-11 13 views
9

Si riceve questo errore quando si chiama un servizio WCF .net 4.0 utilizzando il framework di entità.La sezione 'DbProviderFactories' può essere visualizzata solo una volta per file di configurazione

The 'DbProviderFactories' section can only appear once per config file 

E 'la prima applicazione sul server utilizzando EF ed altri servizi 4.0 WCF .net non ricevono questo errore.

C'è un modo per correggere questo errore senza modificare il file di configurazione macchina sul server?

+0

Il motivo è che il nostro team di server vuole che dimostri che questo è il problema m prima che siano disposti a modificare la configurazione della macchina. Quindi devo risolvere il problema senza modificare la configurazione in modo che possano risolvere la configurazione della macchina ... sì, questo problema – Chad

+1

Puoi pubblicare i bit del file di configurazione attorno a dove definisce la sezione DbProviderFactories? Questa pagina dice che è possibile eliminare il secondo tag DbProviderFactories e risolve il problema. È questo il problema che hai ?: http://forums.asp.net/t/1693277.aspx/1 –

+0

@EricLeschinski - No, non posso non avere accesso alla configurazione. Sono consapevole di quella correzione ... è ciò che sto cercando di dimostrare è necessario lavorando intorno ad esso. – Chad

risposta

5

Forse potresti creare voci di web.config che sostituiscono le impostazioni a livello di computer che desideri modificare.

descritto qui:

Override machine.config by web.config

Mettere le istruzioni <clear /> all'interno dei tag DbProviderFactories nella configurazione web per cancellare e poi ignorare le voci duplicate fatte nella configurazione della macchina. Così facendo un hack-work sull'errore in machine.config.

+1

Grazie, ero in grado di usarlo per scavalcare la configurazione della macchina e dimostrare che avevano bisogno di correggere la configurazione della macchina ... I <3 politica – Chad

8

L'installazione per il provider IBM DB2 .NET, causa un DbProviderFactories vuoto, vedere di seguito. Basta eliminare il secondo DbProviderFactories voce vuota

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

C'è un modo per correggere questo errore senza modificare il file di configurazione della macchina sul server? - Non ho accesso alla macchina config per rimuoverlo. – Chad

+0

Ciao Chad, non che io sappia, ho dovuto toccare e modificare questo file. Chiedo a sysadmin di agire questo per voi. – yonsk

1

Come @yonsk già detto il motivo per cui si verifica questo problema (duplicate ingresso di), è possibile creare un'applicazione console che può correggere il file machine.config e poi, richiamare che l'applicazione di console dal programma di installazione dell'applicazione o dall'applicazione ogni volta che si ottiene l'eccezione. Il seguente codice può essere utilizzato per l'applicazione console che correggerà il file 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); 
     } 
    } 

Se si desidera chiamare l'applicazione console, dall'applicazione, è necessario richiamarlo come amministratore. Così, il seguente frammento può aiutare a invocare tale applicazione console come amministratore (l'utente verrà richiesto con una finestra di dialogo per accettare ..)

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

      } 
+1

Sono abbastanza sicuro se ho provato a correre che sarei stato licenziato .. Ma ottima soluzione . – Chad

3

Dovete aggiornare il file Machine.config situato nei percorsi di seguito.

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Machine.Config
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Machine.Config

Per le macchine a 64 bit, Machine.config sarà situato in ...\Framework64\...

Il blocco di prestare attenzione a questo è:

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

dalla domanda 'C'è un modo per correggere questo errore senza modificare il file di configurazione macchina sul server?' Questa è la parte chiave ... – Chad

+0

Scusa Ciad. Ho perso quella linea. Mi sono concentrato sul titolo. Stavo cercando un modo per correggere l'errore e ho trovato la soluzione altrove. Ho pensato di condividerlo qui, quindi sarà utile per qualcuno. – Sundeep

+1

Importante da notare: Devi essere amministratore per poter salvare il file dopo aver eliminato la linea. – Alexandre

Problemi correlati