2012-10-26 22 views
6

ich neue WCF-Programmierung, habe ich Reihe von Ersten Schritten Tutorials von folgendem Link gefolgtWCF mit Visual Studio 2012

http://msdn.microsoft.com/en-us/library/ms734712.aspx

I Service in Konsolenanwendung gehostet habe, aber wenn ich einen Client zu erstellen versucht und Ich habe versucht, Service-Referenz hinzuzufügen. Ich habe die folgenden Ausnahmen.

There was an error downloading 'http: localhost:8000/GettingStarted/mex/_vti_bin/ListData.svc/$metadata'. The request failed with HTTP status 405: Method Not Allowed. Metadata contains a reference that cannot be resolved: 'http: localhost:8000/GettingStarted/mex'. There was no endpoint listening at http: localhost:8000/GettingStarted/mex that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. The remote server returned an error: (404) Not Found. If the service is defined in the current solution, try building the solution and adding the service reference again.

Code Anwendung von Hosting

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Step 1 Create a URI to serve as the base address. 
     Uri baseAddress = 
      new Uri("http://localhost:8000/GettingStarted/"); 

     // Step 2 Create a ServiceHost instance 
     ServiceHost selfHost = 
      new ServiceHost(typeof(CalculatorService), baseAddress); 

     try 
     { 
      // Step 3 Add a service endpoint. 
      selfHost.AddServiceEndpoint(typeof(ICalculator), 
       new WSHttpBinding(), 
       "CalculatorService"); 

      // Step 4 Enable metadata exchange. 
      var smb = new ServiceMetadataBehavior(); 
      smb.HttpGetEnabled = true; 
      selfHost.Description.Behaviors.Add(smb); 

      // Step 5 Start the service. 
      selfHost.Open(); 
      Console.WriteLine("The service is ready."); 
      Console.WriteLine("Press <ENTER> to terminate."); 
      Console.WriteLine(); 
      Console.ReadLine(); 

      // Close the ServiceHostBase to shutdown. 
      selfHost.Close(); 
     } 
     catch (CommunicationException ce) 
     { 
      Console.WriteLine("exception: {0}", ce.Message); 
      selfHost.Abort(); 
     } 
    } 
} 

Jetzt bin ich nicht in der Lage, herauszufinden, was das Problem ist. Ich benutze Visual Studio 2012 und .net Plattform 4.5.

+0

Erstens konnten Sie erfolgreich einen Dienst hosten? Können Sie die Ausgabe Ihrer Konsolenanwendung freigeben? – Praburaj

Antwort

8

ich auch ein ähnliches Problem hatte, mit dieser Unordnung. Ja, Sie scheinen dem Tutorial korrekt gefolgt zu sein, aber wenn Sie eine Verbindung zu ihm herstellen und als Dienst konsumieren möchten (wie in einer Dienstreferenz), müssen Sie auch den MEX-Dienst enpoint hinzufügen. Fügen Sie diese Zeile nach dem selfhost.Description.Behaviors.Add (smb):

selfhost.AddServiceEndpoint(
      typeof(IMetadataExchange), 
      MetadataExchangeBindings.CreateMexHttpBinding(), 
      "http://localhost:8000/GettingStarted/mex"); 

, dass Sie sollten ermöglichen eine Verbindung über "Add Service Reference". Außerdem habe ich festgestellt, dass abhängig von Ihrem System, müssen Sie VS als Administrator ausführen, um die Verbindung zum Netzwerk zu ermöglichen (für den Fall, dass Sie es versehentlich in der Vergangenheit nicht mitgeteilt).

+0

Ich habe den gleichen Fehler, wie kann ich es über app.config anstelle von Code konfigurieren? –

+0

Ich habe dasselbe Problem. Ijust check config of service und ich habe diese Zeile Ist dies der MEX Service-Endpunkt? –

+0

Warum ist das notwendig, wenn SoapUI den Dienst ohne Probleme entdecken kann? Nur wenn ich versuche, diesen (VS2015-Projekt) Dienst von VS2015 zu konsumieren, stoße ich auf dieses Problem. Aber SoapUI kann es ohne Probleme entdecken. –

0

Aus der Fehlermeldung geht hervor, dass am angegebenen Port kein Dienst zu hören ist. Sie benötigen die Konsolenanwendung, in der der Dienst ausgeführt wird, wenn Sie versuchen, eine Dienstreferenz hinzuzufügen.

+0

Hallo Danke für die Antwort, Konsole-Anwendung läuft, aber immer noch gleichen Fehler –

+0

Stellen Sie auch sicher, dass HttpGetEnabled in Ihrem Dienst aktiviert ist. Andernfalls kann Ihr Kunde den Servicevertrag nicht erhalten. –

0

Scheinbar läuft der Dienst nicht, was bedeutet, dass kein Endpunkt auf die URL hört, die Sie zum Erstellen der Dienstreferenz verwenden.

Sie können den Dienst in IIS hosten oder die Konsolenanwendung wie oben beschrieben als Damir ausführen lassen.

0

Stellen Sie sicher, dass Ihr Server ausgeführt wird, wenn Sie versuchen, darauf zuzugreifen. Überprüfen Sie außerdem die Konfiguration auf dem Server und stellen Sie sicher, dass der Endpunkt des Clients mit dem Endpunkt des Servers übereinstimmt. Stellen Sie sicher, dass Sie auch die gleiche Bindung verwenden, während Sie dabei sind. Stellen Sie sicher, dass der Server überwacht und die Firewall des Servers Sie nicht blockiert. Wenn Sie Ihren WCF-Dienst geändert haben, vergessen Sie nicht, den Dienstverweis für Ihre Clientanwendung neu zu generieren.

+0

Hi Konsole-Anwendung wurde ausgeführt, wenn ich Service-Referenz –

0

Sind Sie sicher, dass Sie einen MEX-Endpunkt definiert haben? Dies stellt Metadateninformationen zu Ihrem Dienst bereit, sodass Studio einen Client-Proxy generieren kann.

Im Tutorial Sie verbunden sind, ist es this bit:

// Step 4 Enable metadata exchange. 
ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
smb.HttpGetEnabled = true; 
selfHost.Description.Behaviors.Add(smb); 
+0

hinzufügen wollte Ja, es ist dort in der Hosting-Anwendung, wie Sie sehen können, habe ich die Frage bearbeitet und es Code der Hosting-Anwendung enthält, sollte ich app.config auch? –

0

Wenn Sie den Web-Dienst in IIS hosten, in web.config überprüfen (unter Verhaltensweisen Abschnitt)

httpsGetEnabled auf True gesetzt ist

0

ich heute in ein ähnliches Problem lief. Allerdings war es für mich nicht notwendig, die Endpunkte explizit hinzuzufügen, wie @iMortalitySX bereits sagte.

Ich hatte einen anderen Grund für das Scheitern: Ich war verbindlich an http://0.0.0.0, denke, die listen IP ist egal. In der Tat, über SoapUI I war in der Lage, zu verbinden und den Service zu nutzen. Bei dem Versuch, den Dienst in einem anderen Visual Studio-Projekt zu ermitteln, schlägt die Erkennung jedoch fehl, da VS die erste Antwort erhalten würde, dann aber die Links weiterverfolgt, die http://0.0.0.0 enthielten und dann fehlschlagen.

So geändert http://0.0.0.0 in die richtige IP meines Computers mein Problem behoben.

-1

Versuchen Sie die Adresse in Ihrem Browser. In meinem Fall konnte ich ein ExceptionDetail sehen.