2010-06-15 7 views
11

Mam projekt, który musi implementować usługi danych WCF (OData) w celu pobrania danych z systemu sterowania (.NET Framework Application). Usługa danych WCF musi być hostowana przez aplikację .NET (bez ASP.NET i NO IIS).Jak zaimplementować usługi danych WCF z własnym hostem (http: // localhost: 1234/myDataService.svc/...)

Niedawno widziałem wiele przykładów usług danych WCF; wszystkie są hostowane przez aplikację ASP.NET. Widzę także przykłady self-host (aplikacja konsoli), ale dotyczy to usługi WCF (nie usługi danych WCF).

Możliwe jest posiadanie samodzielnych aplikacji .NET do hostingu usług danych WCF (http: //localhost:1234/mydataservice.svc/...).

Jeśli tak, czy ktoś może podać przykład?

+0

Czy próbowałeś? Czy byłeś w stanie samodzielnie hostować normalną usługę WCF? –

+1

Bounty przejdzie do marc_s po upływie limitu czasu. (Za jego fantastyczną odpowiedź, która zaoszczędziła mi mnóstwo czasu.) Nie potrzeba nowej odpowiedzi na nagrodę. – Vaccano

Odpowiedz

28

Po prostu wypróbowałem to samo - i tak, możesz zorganizować usługę danych WCF we własnym zespole - za pomocą kilku drobnych sztuczek.

Oto jak:

  • umieścić swój model danych (EF Dane modelu) do własnego montażu, nazwijmy to DataModel

  • utworzyć projekt nowej biblioteki klasy (nazywają to MyDataServiceHost)

  • dodać kilka odnośników:

    • swój zespół DataModel z warstwy danych
    • System.ServiceModel
    • System.ServiceModel.Web
    • System.Data.Services.Client
    • System.Data.Services - nie można odebrać to od zwykłych Add Reference oknie poniżej kategorii .NET - trzeba wyszukać plik montażowej. Znajdź katalog (lub C:\Program Files (x86)\... na komputerze 64-bitowym) i wybrać System.Data.Services.dll wewnątrz to
  • dodać nową klasę do tej klasy biblioteki i nazwać np YourDataService.cs - będzie to wyglądać mniej więcej tak:

    using System.Data.Services; 
    using System.Data.Services.Common; 
    
    using DataModel; 
    
    namespace MyDataServiceHost 
    { 
        public class YourDataService : DataService<YourModelEntities> 
        { 
         // This method is called only once to initialize service-wide policies. 
         public static void InitializeService(DataServiceConfiguration config) 
         { 
          // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc. 
          // Examples: 
          config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); 
          config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
         } 
        } 
    } 
    

    można nazwać klasy co chcesz, i to musi wynikać z DataService<T> gdzie T jest nazwą modelu danych; jeśli używasz Entity Framework, jest to nazwa obiektu klasy kontekstu - zazwyczaj coś (database)Entities lub cokolwiek zbierane podczas tworzenia EDM

  • dodać kolejną klasę do swojego nowego projektu, nazywamy go MyDataServiceHost.cs i będzie wyglądać coś takiego:

    using System; 
    using System.Data.Services; 
    
    using DataModel; 
    
    namespace MyDataServiceHost 
    { 
        public class MyDataServiceHost 
        { 
         public static void LaunchDataService(string baseAddress) 
         { 
          Uri[] baseAddresses = new Uri[1]; 
          baseAddresses[0] = new Uri(baseAddress); 
    
          using(DataServiceHost host = new DataServiceHost(typeof(YourDataService), baseAddresses)) 
          { 
           host.Open(); 
           Console.WriteLine("DataService up and running....."); 
    
           Console.ReadLine(); 
           host.Close(); 
          } 
         } 
        } 
    } 
    

    to instancję DataServiceHost, która pochodzi z WebServiceHost (który z kolei wywodzi się z ServiceHost) i będzie obracać się runtime WCF Data Service dla Ciebie.

  • teraz można rozpocząć swoje usługi WCF danych z dowolnej aplikacji przy użyciu:

    MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService"); 
    
  • Ostatnią rzeczą do zapamiętania: aplikacja, która służy do uruchomienia usługi WCF danych musi mieć ciąg połączenia (ciąg połączenia EDM, jeśli korzystasz z Entity Framework) w pliku app.config (lub web.config), aby to zadziałało!

+0

Jeśli już oglądasz to pytanie, podążyłem za twoją odpowiedzią i uruchomiłem usługę, ale kiedy próbuję wyświetlić ją w Firefoksie tak: http: // localhost: 4444/EntitySearch/Kraje, otrzymuję ten wynik: 'Zasób nie znaleziono dla segmentu "Kraje". Sprawdziłem dwukrotnie swój kod EF i tam jest ta klasa ("publiczne kraje ObjectSet ") Jakieś pomysły? – Vaccano

+0

Wprowadziłem błędną nazwę metody "InitializeService". (Grr, powinien był po prostu skopiować i wkleić.) – Vaccano

+0

Zalecam zainstalowanie pakietu NuGet pakietu usług WCF Data Services zamiast nawigowania do lokalnego zespołu w celu odniesienia się do System.Data.Services. – Kilhoffer

Powiązane problemy