2009-02-26 15 views
15

Sono nuovo a WCF e sto provando a far funzionare il mio primo servizio. Sono vicino ma bloccato su questo problema.Servizio WCF: runtime non visualizza ServiceContract sull'interfaccia

Nel mio file di definizione di interfaccia, ho questo:

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

Poi ho il mio file di classe (per il servizio) che eredita esso:

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

Infine, nel mio progetto Host I avere questo:

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

Tutto compila bene, e quando l'host va ad aggiungere l'endpoint del servizio, it b ombs con questo: "Il tipo di contratto Inventory.InventoryService non è attribuito con ServiceContractAttribute. Per definire un contratto valido, il tipo specificato (o interfaccia del contratto o classe di servizio) deve essere attribuito con ServiceContractAttribute. "

So che mi manca qualcosa di semplice qui. Ho l'interfaccia chiaramente indicata come un contratto di servizio e c'è un riferimento a tale progetto nel progetto di accoglienza

risposta

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

Se l'attributo ServiceContract è sull'interfaccia non la classe concreta, provare quanto segue:.

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

Quando provo che mi dà la ArgumentException, "ServiceHost solo supporto s tipi di servizio di classe. " –

+0

Commutato quello sbagliato - cambia la chiamata AddServiceEndpoint all'interfaccia, mantieni ServiceHost come classe. – Brian

+0

Trovato! Quindi sto istanziando ServiceHost, passando la classe concreta, ma sto definendo l'endpoint, o associazione, con l'interfaccia, che è in realtà la definizione del contratto (cioè non la classe). Alla fine prenderò il blocco di questo. Grazie Brian e Andrew. –