2009-02-26 8 views
15

Je suis nouveau à WCF et essaye de faire fonctionner mon premier service. Je suis proche, mais coincé sur ce problème.Service WCF - l'exécution ne voit pas le contrat de service sur l'interface

Dans mon fichier de définition d'interface, j'ai ceci:

[ServiceContract(Namespace="http://mysite.com/wcfservices/2009/02")]  
    public interface IInventoryService 
    { 
     [OperationContract] 
     string GetInventoryName(int InventoryID); 
    } 

J'ai mon fichier de classe (pour le service) qui hérite:

public class InventoryService : IInventoryService 
    { 
     // This method is exposed to the wcf service 
     public string GetInventoryName(int InventoryID) 
     { 
      return "White Paper"; 
     } 

Enfin, dans mon projet d'accueil I avoir ceci:

ServiceHost host = new ServiceHost(typeof(Inventory.InventoryService)); 
    host.AddServiceEndpoint(typeof(Inventory.InventoryService), new NetTcpBinding(), 
     "net.tcp://localhost:9000/GetInventory"); 
    host.Open(); 

Tout compile bien, et quand l'hôte va ajouter le point de terminaison de service, il b ombs avec ceci: "Le type de contrat Inventory.InventoryService n'est pas attribué à ServiceContractAttribute. Pour définir un contrat valide, le type spécifié (interface de contrat ou classe de service) doit être attribué à ServiceContractAttribute. "

Je sais qu'il me manque quelque chose de simple: j'ai l'interface clairement identifiée comme un contrat de service et il y a une référence à ce projet dans le projet hôte

Répondre

25
ServiceHost host = new ServiceHost(typeof(Inventory.InventoryService)); 
host.AddServiceEndpoint(typeof(Inventory.InventoryService), new NetTcpBinding(), 
    "net.tcp://localhost:9000/GetInventory"); 
host.Open(); 

Si votre attribut ServiceContract est sur l'interface et non la classe concrète, procédez comme suit:.

ServiceHost host = new ServiceHost(typeof(Inventory.InventoryService)); 
host.AddServiceEndpoint(typeof(Inventory.IInventoryService), new NetTcpBinding(), 
    "net.tcp://localhost:9000/GetInventory"); 
host.Open(); 
+0

Quand j'essaie que cela me donne la ArgumentException, "Support ServiceHost uniquement s les types de service de classe. " –

+0

Commuté le mauvais - changez l'appel AddServiceEndpoint à l'interface, gardez ServiceHost en tant que classe. – Brian

+0

J'ai compris! J'instancie donc ServiceHost en passant dans la classe concrète, mais je définis le point de terminaison, ou liaison, avec l'interface, qui est en fait la définition du contrat (c'est-à-dire pas la classe). Je finirai par comprendre. Merci Brian et Andrew. –

Questions connexes