2010-06-15 15 views
11

J'ai un projet qui doit implémenter des services de données WCF (OData) pour récupérer des données à partir d'un système de contrôle (Application .NET Framework). Le service de données WCF doit être hébergé par l'application .NET (non ASP.NET et NO IIS). J'ai vu récemment de nombreux exemples de services de données WCF; ils sont tous hébergés par l'application ASP.NET. Je vois également les exemples d'auto-hôte (application console), mais c'est pour le service WCF (pas le service de données WCF).Comment implémenter serivces de données WCF auto-hôte (http: // localhost: 1234/myDataService.svc/...)

Il est possible d'avoir des applications .NET autonomes pour héberger les services de données WCF (http: //localhost:1234/mydataservice.svc/...).

Si oui, quelqu'un peut-il donner un exemple?

+0

Avez-vous essayé? Avez-vous été capable d'héberger un service WCF normal? –

+1

Bounty ira à marc_s après que la limite de temps soit écoulée. (Pour sa réponse fantastique qui m'a épargné des tonnes de temps.) Aucune nouvelle réponse n'est nécessaire pour la prime. – Vaccano

Répondre

28

J'ai juste essayé la même chose - et oui, vous pouvez héberger un service de données WCF dans votre propre assemblage - avec quelques petites astuces.

Voici comment:

  • mettre votre modèle de données (EF Data Model) dans sa propre assemblée, appelons-le DataModel

  • créer un nouveau projet de bibliothèque de classes (appeler MyDataServiceHost)

  • ajouter quelques références:

    • votre assemblage DataModel avec la couche de données
    • System.ServiceModel
    • System.ServiceModel.Web
    • System.Data.Services.Client
    • System.Data.Services - vous ne pouvez pas choisir ce des Add Reference habituels de dialogue dans la catégorie .NET - vous devez rechercher le fichier d'assemblage. Trouvez le répertoire (ou C:\Program Files (x86)\... sur une machine 64 bits) et choisir le System.Data.Services.dll intérieur
  • ajouter une nouvelle classe à cette bibliothèque de classes et de l'appeler par exemple YourDataService.cs - il ressemblera à quelque chose comme ceci:

    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; 
         } 
        } 
    } 
    

    Vous pouvez nommer le classe que vous aimez, et il doit tirer de DataService<T>T est le nom de votre modèle de données; si vous utilisez Entity Framework, c'est le nom de votre objet contexte classe - généralement quelque chose comme (database)Entities ou tout ce que vous avez choisi lorsque vous avez créé l'EDM

  • ajouter une autre classe à votre nouveau projet, appelez-le MyDataServiceHost.cs et il regardera quelque chose comme ceci:

    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(); 
          } 
         } 
        } 
    } 
    

    il instancie un DataServiceHost, qui est dérivé de WebServiceHost (qui à son tour est dérivé de ServiceHost) et il tournera le temps d'exécution WCF Data service pour vous.

  • maintenant vous pouvez démarrer votre service WCF Data de toute application utilisant:

    MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService"); 
    
  • dernière chose à retenir: l'application que vous utilisez pour lancer le service WCF Data devez avoir la chaîne de connexion (la chaîne de connexion EDM, si vous utilisez Entity Framework) dans son app.config (ou web.config) pour que cela fonctionne!

+0

Si vous regardez cette question plus, j'ai suivi votre réponse et ai fait tourner le service, mais quand j'essaye de le voir dans Firefox comme ceci: http: // localhost: 4444/EntitySearch/Countries J'obtiens ce résultat: 'Resource not trouvé pour le segment 'Pays'. 'J'ai vérifié mon code EF et cette classe est là (' ObjectSet public Countries ') Des idées? – Vaccano

+0

J'avais mal orthographié le nom de la méthode 'InitializeService'. (Grr, devrait avoir juste copié et collé.) – Vaccano

+0

Je recommande d'installer le package NuGet WCF Data Services Server au lieu de naviguer vers un assembly local pour la référence à System.Data.Services. – Kilhoffer