2012-12-28 7 views
5

Si prega di scusare questa domanda da un principiante estremo. Non sono riuscito a trovare la risposta altrove.WCF e EF - Come forzare l'host a utilizzare la propria stringa di connessione

Sto scrivendo una soluzione utilizzando Entity Framework e WCF. Scriverò diversi clienti diversi. Ho inserito la stringa di connessione del database in app.config del progetto Entity Framework e nel file app.config dell'host WCF.

Nella classe host, ho scritto un semplice contratto di servizio di test con un metodo che recupera semplicemente tutti i clienti dal database (da EF), chiamato GetAllCustomers(). Ho quindi scritto una semplice app client per console per chiamare GetAllCustomers() dell'host e scrivere tutti i nomi e i cognomi dei clienti sulla console.

Quando ho provato a fare funzionare il cliente, ho ottenuto un errore che dice: "No stringa di connessione denominata 'TRS11Entities' potrebbe essere trovato nel file config.

Se copio la stringa di connessione per console del client app file app.config, funziona, ma se commento, non funziona di nuovo

Poiché l'host WCF sta parlando al database, non direttamente al client, non capisco perché il client avrebbe bisogno di una stringa di connessione Posso solo supporre che la stringa di connessione stia passando la catena dal client all'host WCF a Entity Framework Come posso rendere l'host WCF a dire a .NET, "Il buck si ferma qui! Usa la stringa di connessione del mio app.config e smetti di disturbare il client per queste informazioni! "

Se è importante, sto utilizzando Visual Studio Pro 2012, con tutti i progetti scritti in C# e il targeting del framework .NET V4.5.

Da app.config nel progetto di servizio WCF:

<system.serviceModel> 
    <services> 
     <service name="OrsonServiceLibrary.Service1"> 
     <endpoint address="localhost" binding="basicHttpBinding" name="TRS11Entities" 
      contract="OrsonServiceLibrary.IService1"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8733/Design_Time_Addresses/OrsonServiceLibrary/Service1/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, 
      set the values below to false before deployment --> 
      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> 
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true. Set to false before deployment 
      to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="False" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
    <connectionStrings> 
    <add name="TRS11Entities" connectionString="metadata=res://*/TRS11Model.csdl|res://*/TRS11Model.ssdl|res://*/TRS11Model.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='character set=NONE;data source=localhost;initial catalog=&quot;C:\Program Files (x86)\TRS11\Data\DATA1100.FDB&quot;;user id=sysdba;password=masterkey'" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

Da app.config nel progetto Entity Framework:

<configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <connectionStrings> 
    <add name="TRS11Entities" connectionString="metadata=res://*/TRS11Model.csdl|res://*/TRS11Model.ssdl|res://*/TRS11Model.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='initial catalog=&quot;C:\Program Files (x86)\TRS11\Data\DATA1100.FDB&quot;;user id=sysdba;password=masterkey;data source=localhost'" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    </entityFramework> 

Da app.config nel c onsole client App:

<system.serviceModel> 
    <client> 
     <endpoint address="http://localhost:8000/Service1" contract="OrsonServiceLibrary.IService1" binding="basicHttpBinding" /> 
    </client> 
    </system.serviceModel> 

    <!--<connectionStrings> 
    <add name="TRS11Entities" connectionString="metadata=res://*/TRS11Model.csdl|res://*/TRS11Model.ssdl|res://*/TRS11Model.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='character set=NONE;data source=localhost;initial catalog=&quot;C:\Program Files (x86)\TRS11\Data\DATA1100.FDB&quot;;user id=sysdba;password=masterkey'" providerName="System.Data.EntityClient" /> 
    </connectionStrings>--> 

Codice per GetAllCustomers() nel progetto servizio WCF:

public HashSet<CUSTOMER> GetAllCustomers() 
{ 
    var db = new TRS11Entities(); 

    HashSet<CUSTOMER> TheCusts = new HashSet<CUSTOMER>(); 

    foreach (CUSTOMER c in db.CUSTOMERs) 
    { 
     TheCusts.Add(c); 
    } 

    return TheCusts; 
} 

Console codice client app:

static void Main(string[] args) 
{ 
    Console.WriteLine("Press Enter to begin."); 
    Console.ReadLine(); 

    Service1 MyService = new Service1(); 

    HashSet<CUSTOMER> cl = MyService.GetAllCustomers(); 

    foreach (CUSTOMER c in cl) 
    { 
     Console.WriteLine(c.CUSTFNAME + " " + c.CUSTLNAME); 
    } 

    Console.WriteLine("Press Enter to exit."); 
    Console.ReadLine(); 
} 

codice dell'applicazione host:

class Program 
{ 
    static void Main(string[] args) 
    { 
     ServiceHost hostA = null; 

     try 
     { 
      hostA = new ServiceHost(typeof(Service1)); 
      hostA.Open(); 

      Console.WriteLine(); 
      Console.WriteLine("Host started. Press Enter to terminate host."); 
      Console.ReadLine(); 

     } 
     finally 
     { 
      if (hostA.State == CommunicationState.Faulted) 
       hostA.Abort(); 
      else 
       hostA.Close(); 
     } 
    } 
} 

Grazie, Joe

+0

Oh, ho solo pensato di menzionarlo, nel caso abbia importanza ... Non ho ancora un'app host per il servizio WCF. Finora, è solo una libreria di classi WCF e io la sto ospitando nell'host del servizio WCF per i test. -Joe – JoeMjr2

+0

Solo perché pensavo che l'host del servizio WCF potesse essere il problema, sono andato avanti e ho scritto un semplice host EXE per ospitare il servizio. Inserisco la stringa di connessione nel file app.config dell'app host, ma ricevo comunque l'errore. – JoeMjr2

+1

Benvenuti nello stack overflow! Quando fai domande, piuttosto che descrivere il codice che hai scritto, è meglio pubblicarlo insieme alla tua domanda. In questo caso mi piacerebbe vedere le sezioni di configurazione (i bit che riguardano la stringa di connessione) e il codice che stai usando per estrarli. Grazie. –

risposta

2

Qualcosa mi dice che in realtà stai creando un'istanza del servizio nell'app client anziché utilizzare un proxy/canale.

Qual è il tipo di servizio1 nel codice dell'app client? È OrsonServiceLibrary.Service1?

Service1 MyService = new Service1(); 

Se è così, è sufficiente rimuovere il riferimento al progetto di servizio e Add Service Reference invece. Questo genererà un proxy, che è possibile utilizzare per accedere al servizio.

+0

Sì, era così! Avevo creato il riferimento del servizio, ma avevo anche aggiunto un riferimento al progetto del servizio e stavo creando un'istanza al posto del proxy. Grazie! – JoeMjr2

1

L'app client non sta passando la connessione al servizio wcf. La mia ipotesi è che tu stia effettuando una chiamata non intenzionale al tuo database nella tua app client. Ciò spiegherebbe l'errore e il motivo per cui funziona quando aggiungi la stringa di connessione all'app della console.

Spero che questo aiuti. Pubblica un po 'di codice e potremmo essere in grado di aiutarti di più.

+0

Grazie. Ho aggiunto quelle che penso siano le parti rilevanti del mio codice alla mia domanda originale. Fammi sapere se dovrei pubblicare un altro codice. – JoeMjr2

0

Senza codice, rende la risposta alla tua domanda molto più difficile, tuttavia, sospetto che il tuo problema sia la stringa di connessione in un file di configurazione dell'app della libreria.La distinzione qui è che quando si esegue il programma le impostazioni vengono caricate dal file di configurazione dell'app di assemblaggio in esecuzione.

Verificare che le impostazioni siano nel file "MyApp. exe ​​ .config".

+1

Ciò potrebbe interessare anche i file di configurazione per più librerie. http://stackoverflow.com/questions/5674971/app-config-for-a-class-library – Jake1164

Problemi correlati