2012-03-26 7 views
0

Ich arbeite an einem einfachen WCF-Dienst, MiniCalcService, der nur eine Operation hat Add. Der Client und der Host sind beide Konsolenanwendungen. Die Client-Anwendung nimmt die für jede Operation notwendigen Operanden auf und gibt sie an den Service weiter. Der Service gibt das Ergebnis zurück, das auf der Client-Konsole angezeigt würde.WCF EndpointNotFoundException

  • -Host läuft
  • ich alles in Code tue so weit und es gibt keine app.config.
  • Es gibt keine großen Daten weitergegeben werden, nur zwei oder drei Zahlen

Das gestern für mich gearbeitet. Heute, wenn ich das gleiche versuchte, löst es die folgende Ausnahme aus:

Es gab kein Endpunkt, der bei http://localhost:8091/MiniCalcService abhörte, der die Nachricht annehmen konnte.

Hier ist die Stack Trace. Nicht, dass es wichtig wäre, aber MiniCalcClient ist in Visual Studio entwickelt und MiniCalcService und MiniCalcHost sind in SharpDevelop entwickelt.

MiniCalcHost:

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), new Uri("http://localhost:8091/MiniCalcService"))) 
{ 
    host.AddServiceEndpoint(typeof(MiniCalcService.IService),new BasicHttpBinding(),"Service"); 

    ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
    smb.HttpGetEnabled = true; 
    host.Description.Behaviors.Add(smb); 

    host.Open(); 
    Console.WriteLine("Serving MiniCalcService since {0}", DateTime.Now); 
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . "); 
    Console.ReadKey(true); 
} 

MiniCalcClient:

Servicevertrag IService:

[ServiceContract(Namespace="learning.wcf.MiniCalc")] 
public interface IService 
{ 
    [OperationContract] 
    double Add(params int[] operands); 
} 

Können Sie mir bitte helfen herauszufinden, was diese Ausnahme verursacht?


Lösung: änderte ich diese Zeile:

EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService"); 

dazu:

EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService/Service"); 

und es funktionierte.

+0

Können Sie uns zeigen, den Servicevertrag ('IService1') –

+0

Ich habe den Servicevertrag 'IService' hinzugefügt. – Animesh

+0

Ja, es ist mit ServiceContractAttribute dekoriert. Kein Grund, warum Int nicht verwendet werden sollte, aber ich hatte ursprünglich eine "Mul" -Methode und hatte "doppelt", da die Operation Contracts von unterschiedlicher Natur waren. Also verwende einfach doppelt für 'Add', um Konsistenz zu haben. – Animesh

Antwort

2

Ich bin nicht sicher, ob Sie die params in einem WCF-Service-Aufruf verwenden können .... scheint überflüssig, trotzdem ....

Können Sie diese beiden Serviceverträge stattdessen versuchen, nur um zu sehen, ob diejenigen, funktionieren würde:

[ServiceContract(Namespace="learning.wcf.MiniCalc")] 
public interface IService2 
{ 
    [OperationContract] 
    int Add(int op1, int op2); 
} 

und

[ServiceContract(Namespace="learning.wcf.MiniCalc")] 
public interface IService3 
{ 
    [OperationContract] 
    int Add(List<int> operands); 
} 

ich frage mich nur, wenn die params von Ihrem Service-Vertrag zu entfernen könnte es laufen zu lassen - alles scheint auf den ersten Blick gut ...


OK, es war nicht der erste Versuch ......


Nun - ganz offensichtlich, wirklich: Sie verwenden einen using Block um die Service-Host Instanziierung:

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), new Uri("http://localhost:8091/MiniCalcService"))) 
{ 
    host.AddServiceEndpoint(typeof(MiniCalcService.IService),new BasicHttpBinding(),"Service"); 

    ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
    smb.HttpGetEnabled = true; 
    host.Description.Behaviors.Add(smb); 

    host.Open(); 
    Console.WriteLine("Serving MiniCalcService since {0}", DateTime.Now); 
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . "); 
} 

Also von der Zeit erreicht der Code den Schließbügel }, die ServiceHost Instanz angeordnet werden und somit geschlossen die Service-Host. Es gibt keinen laufenden Service-Host mehr!

Sie müssen stoppen Sie die Codeausführung irgendwo nach dem Anruf host.Open() von z.

Console.ReadLine(); 

oder etwas anderes.

So Ihre erste Behauptung, dass Host- wirklich läuft nicht halten - es ist kurz ausgeführt und dann sofort wieder beendet wird .....

+0

Entschuldigung für das Problem, ich hatte wirklich den 'Console.ReadKey (true)' und habe ihn gerade zum Code hinzugefügt, als ich ihn überhaupt verpasste. Deshalb wird zuerst erwähnt, dass der Host läuft. – Animesh

+0

@KishorNanda: aktualisierte meine Antwort mit zwei möglichen neuen Service-Verträgen - könnten Sie sehen, ob diese funktionieren würden? –

+0

Ich habe gerade einen neuen Service IService2 hinzugefügt und es implementiert und gehostet es auf die gleiche Weise. Dann kopierte den Proxy auf Host und änderte den Code entsprechend, um IService2 aufzurufen. Trotzdem bekomme ich dieselbe EndpointNotFoundException. :( Ich werde die IService3 versuchen und zurück zu Ihnen in einem Moment bekommen – Animesh