2012-03-25 20 views
13

Mam usługa o nazwie WcfService2 (oryginalna wiem), który posiada plik programu IService.cs z publicznym interfejsem:ServiceHost obsługuje tylko typy klasy usługi

namespace WcfService2 
{ 
    [ServiceContract] 
    public interface IService1 
    {  
     [OperationContract] 
     [WebGet(UriTemplate = "/{value}")] 
     string GetData(string value);    
    } 
} 

I wtedy mam publiczną klasę Service1.svc.cs plik, który zwraca ciąg dla wartości tak:

namespace WcfService2 
{ 
    public class Service1 : IService1 
    { 
     public string GetData(string value) 
     { 
      return string.Format("You entered: {0}", value); 
     } 
    } 
} 

jestem teraz próbuje zorganizować tę usługę z app konsoli tak:

namespace Host 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      WebHttpBinding binding = new WebHttpBinding(); 
      WebServiceHost host = 
      new WebServiceHost(typeof(IService1)); 
      host.AddServiceEndpoint(typeof(IService1), 
      binding, 
      "http://localhost:8000/Hello"); 
      host.Open(); 
      Console.WriteLine("I DONT LIKE REST!"); 
      Console.WriteLine("Press <RETURN> to KILL REST FOR GOOD"); 
      Console.ReadLine(); 
     } 
    } 
} 

Po uruchomieniu otrzymuję komunikat o błędzie:

ServiceHost obsługuje tylko typy usług klasowych.

To oczywiście odnosi się do mojego IService będącego typem interfejsu publicznego. Ale nie wiem jak inaczej go utworzyć, kiedy po raz pierwszy utworzyłem WCF Service application, daje on dwa standardowe pliki IService i Service.svc, jeśli usuwam albo, albo tylko Implementuję to rozwiązanie w jednej klasie, kiedy próbuję dodać sieć służba w miejscowej duszy nic nie znajduje.

Czy istnieje sposób na manipulowanie kodem hosta?

+0

Jest inna odpowiedź spróbować @ http://stackoverflow.com/q/19306395/16391 – StingyJack

Odpowiedz

25

I sugerują, że to się zmieni:

WebServiceHost host = new WebServiceHost(typeof(IService1)); 

do tego:

WebServiceHost host = new WebServiceHost(typeof(Service1)); 
+1

Otrzymuję ten błąd, jeśli to zrobię: 'Typ umowy WcfService2.Service1 nie jest przypisywany z ServiceContractAttribute. Aby zdefiniować ważną umowę, określony typ (interfejs kontraktowy lub klasa usługi) musi zostać przypisany za pomocą ServiceContractAttribute. –

+1

@Garrith: Nie powinieneś otrzymywać tego pierwszego błędu z opublikowanym kodem. Twoje błądzenie dotyczące usuwania plików może w tym uczestniczyć. –

+3

Każdy, kto przeczyta tę odpowiedź, powinien także zobaczyć: http://stackoverflow.com/questions/9864006/servicecontractattribute-error-on-simple-wcf-service. Becareful as WebServiceHost to Service1, a AddServiceEndpoint to IService1! –

4

Powinieneś utworzyć WebServiceHost z klasą implementującą usługę;

WebServiceHost host = new WebServiceHost(typeof(Service1)); 

Przeczytaj here dla przykładu.

+0

proszę zobaczyć odpowiedź pod odpowiedzią Will Marcouliers. –

Powiązane problemy