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="C:\Program Files (x86)\TRS11\Data\DATA1100.FDB";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="C:\Program Files (x86)\TRS11\Data\DATA1100.FDB";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="C:\Program Files (x86)\TRS11\Data\DATA1100.FDB";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
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
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
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. –