Prosimy o wybaczenie tego pytania od bardzo początkującego użytkownika. Nie mogłem znaleźć odpowiedzi nigdzie indziej.WCF i EF - jak zmusić hosta do używania własnego ciągu połączenia
Piszę rozwiązanie przy użyciu Entity Framework i WCF. Będę pisać kilku różnych klientów. Umieściłem ciąg połączenia z bazą danych zarówno w app.config projektu Entity Framework, jak iw pliku app.config hosta WCF.
W klasie hosta napisałem prostą umowę na usługi testowe za pomocą jednej metody, która po prostu pobiera wszystkich klientów z bazy danych (z EF) o nazwie GetAllCustomers(). Następnie napisałem prostą aplikację kliencką, aby zadzwonić do GetAllCustomers() hosta i napisać imiona i nazwiska wszystkich klientów na konsolę.
Kiedy próbowałem działa klient, mam błąd, który mówi: „No ciąg połączenia o nazwie«TRS11Entities»można znaleźć w pliku konfiguracyjnym aplikacji.
Gdybym skopiować ciąg połączenia do konsoli klienta aplikacji plik app.config, działa dobrze, ale jeśli go skomentuję, to nie działa ponownie.
Ponieważ host WCF rozmawia z bazą danych, a nie bezpośrednio klient, nie rozumiem, dlaczego klient będzie potrzebował ciąg połączenia.Może tylko zgadywać, że ciąg połączenia jest przekazywany w górę łańcucha od klienta do hosta WCF do Entity Framework.Jak mogę uczynić hosta WCF powiedzieć .NET, "Buck zatrzyma się tutaj! Użyj łańcucha połączenia app.config i przestań zawracać sobie głowę klientem za te informacje! "
Jeśli to ma znaczenie, używam Visual Studio Pro 2012, ze wszystkimi projektami napisanymi w C# i celującymi w platformę .NET V4.5.
Od app.config w projekcie usług 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>
Od app.config w projekcie 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>
Od app.config w c onsole aplikacja klient:
<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>-->
Kod GetAllCustomers() funkcja w projekcie WCF Usługa:
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;
}
konsoli kod aplikacji klient:
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();
}
kod aplikacji 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();
}
}
}
Dzięki, Joe
Och, ja też pomyślałem, że wspomnę, na wszelki wypadek ... Nie mam jeszcze aplikacji hosta dla usługi WCF. Do tej pory jest to tylko biblioteka klasy WCF, a ja hostuję ją w Hostie usługi WCF do testowania. -Joe – JoeMjr2
Tylko dlatego, że myślałem, że Host usługi WCF może być problemem, napisałem prosty plik EXE hosta do usługi. Wstawiłem ciąg połączenia w pliku app.config aplikacji hosta, ale nadal dostaję błąd. – JoeMjr2
Witamy w przepełnieniu stosu! Podczas zadawania pytań, zamiast opisywania kodu, który napisałeś, lepiej jest go opublikować wraz z pytaniem. W tym przypadku chciałbym zobaczyć twoje sekcje konfiguracji (bity zajmujące się ciągiem połączeń) i kod, którego używasz do ich wyodrębnienia. Dzięki. –