2012-12-28 11 views
5

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

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

+0

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

+0

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

+1

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. –

Odpowiedz

2

Coś mi mówi, że faktycznie tworzysz instancję usługi w aplikacji klienckiej zamiast używać serwera proxy/kanału.

Jaki jest typ Service1 w kodzie aplikacji klienckiej? Czy to OrsonServiceLibrary.Service1?

Service1 MyService = new Service1(); 

Jeśli tak, to po prostu usunąć odniesienie do projektu usług i Add Service Reference zamiast. Spowoduje to wygenerowanie proxy, którego można użyć do uzyskania dostępu do usługi.

+0

Tak, to było to! Utworzyłem odwołanie do usługi, ale dodałem także odniesienie do projektu usługi i tworzyłem go zamiast proxy. Dzięki! – JoeMjr2

1

Aplikacja kliencka nie przekazuje połączenia do usługi wcf. Domyślam się, że wykonujesz niezamierzone połączenie z bazą danych w aplikacji klienckiej. To by wyjaśniało błąd i dlaczego działa, gdy dodajesz ciąg połączenia do aplikacji konsoli.

Nadzieję, że pomaga. Opublikuj kod i być może będziemy w stanie Ci pomóc.

+0

Dzięki. Dodałem to, co uważam za istotne części mojego kodu do mojego pierwotnego pytania. Daj mi znać, gdybym opublikował inny kod. – JoeMjr2

0

Bez kodu znacznie utrudnia odpowiadanie na twoje pytania. Podejrzewam jednak, że masz problem z łańcuchem połączenia w pliku konfiguracyjnym aplikacji biblioteki.Rozróżnienie polega na tym, że po uruchomieniu programu ustawienia są ładowane z pliku konfiguracyjnego aplikacji wykonawczej złożenia.

Sprawdź, czy ustawienia znajdują się w pliku "MyApp. exe ​​ .config".

+1

Może to również być interesujące w przypadku plików konfiguracyjnych dla wielu bibliotek. http://stackoverflow.com/questions/5674971/app-config-for-a-class-library – Jake1164

Powiązane problemy