2013-03-07 12 views
12

Ho un servizio WCF che ho provato con copiando le sue interfacce su un progetto client di esempio.
Ora voglio lavorare correttamente aggiungendo un riferimento al servizio.
Il servizio è ospitato in windows hosting (utilizzando installUtil).
Il servizio ha 2 progetti - esterni (interfacce + datacontracts) e interni (implementazioni).
Per qualche motivo non ha avuto un app.config così ho aggiunto uno manualmente:Aggiungere riferimento al servizio quando si utilizza il binding netTcp

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="ExecutionService" behaviorConfiguration="Default"> 
     <endpoint name="TCPEndpoint" address="" binding ="netTcpBinding" contract="Externals.IExecutionService"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:3040/ExecutionService"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="Default"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Cercando di aggiungere un riferimento al servizio dal mio cliente del campione provoca il seguente errore:

Metadata contains a reference that cannot be resolved: 'net.tcp://localhost:3040/ExecutionService/Externals.IExecutionService'. 
There was no endpoint listening at net.tcp://localhost:3040/ExecutionService/Externals.IExecutionService that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. 
If the service is defined in the current solution, try building the solution and adding the service reference again. 

I ha visto here che non ce n'è bisogno in app.config.
Sono un po 'confuso e sono alle prime armi con WCF.
Come può una bella app WPF fare riferimento al mio servizio? Voglio che il servizio sia Windows ospitato e non voglio trascinare DLL con me.

Modifica
ho aggiunto un endpoint di metadati e la mia appconfig ora assomiglia a questo:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="ExecutionService" behaviorConfiguration="Default"> 
     <endpoint name="TCPEndpoint" 
        address="" 
        binding ="netTcpBinding" 
        contract="Externals.IExecutionService"/> 
     <endpoint address="mex" 
        binding="maxHttpBinding" 
        contract="Externals.IExecutionService"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:3040/ExecutionService"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="Default"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Ho provato ad aggiungere un riferimento al servizio utilizzando net.tcp://localhost:3040/ExecutionService, net.tcp://localhost:3040/ExecutionService/Externals e net.tcp://localhost:3040/ExecutionService/Externals/IExecutionService e sto ancora ricevendo lo stesso errore.

risposta

26

Hai bisogno di fare:

  1. maxHttpBinding -> mexTcpBinding - non è possibile utilizzare mexHttpBinding su endpoint net.tcp (ed è mex non max)
  2. il contratto per mex endpoint deve essere IMetadataExchange - poiché si desidera che i metadati del servizio siano disponibili tramite questo endpoint
  3. httpGetEnabled = "false" poiché non ci sarà alcun endpoint http per ottenere i metadati da
  4. Quando stavo testando la soluzione in una semplice serie di console avevo bisogno di cambiare nome nel <servizio> tag Externals.ExecutionService (ma questo dipende da come si crea un'istanza del servizio)

Allora il tuo riferimento al servizio sarà disponibile presso: net.tcp://localhost:3040/ExecutionService/mex come indirizzo di base è net.tcp://localhost:3040/ExecutionService e l'indirizzo relativo per l'endpoint mex è impostato mex

app.config finale è inferiore:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<system.serviceModel> 
<services> 
    <service name="Externals.ExecutionService" behaviorConfiguration="Default"> 
    <endpoint name="TCPEndpoint" 
       address="" 
       binding ="netTcpBinding" 
       contract="Externals.IExecutionService"/> 
    <endpoint address="mex" 
       binding="mexTcpBinding" 
       contract="IMetadataExchange"/> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:3040/ExecutionService"/> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="Default"> 
     <serviceMetadata httpGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
</system.serviceModel> 
</configuration> 

Per un test rapido se la configurazione è corretta, ho usato l'app host della console come host del servizio. Program.cs:

using System; 
using System.ServiceModel; 

namespace Externals 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      var sh=new ServiceHost(typeof(ExecutionService)); 
      sh.Open(); 
      Console.WriteLine("Service running press any key to terminate..."); 
      Console.ReadKey(); 
      sh.Close(); 
     } 
    } 
} 

eseguire l'applicazione console e tenta di aggiungere riferimento al servizio al progetto attraverso net.tcp://localhost:3040/ExecutionService/mex.

2

A prima vista, ti sei dimenticato Metadata Endpoint

+0

Ciao, ne ho aggiunto uno, sto ancora ricevendo la stessa eccezione, vedere la modifica in post. – Noich

2

Modifica questo:

<endpoint address="mex" 
        binding="maxHttpBinding" 
        contract="Externals.IExecutionService"/> 

A:

<endpoint address="mex" 
        binding="mexTcpBinding" 
        contract="IMetadataExchange"/> 

Avviso non è maxHttpBinding ma mexTcpBinding, hai avuto errore di digitazione come bene lì.