2011-03-07 62 views
16

Estoy aprendiendo wcf y actualmente llegué tan lejos.El host del servicio WCF no puede encontrar ningún metadato de servicio

CS del archivo:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace wcfLib 
{    
    [ServiceContract] 
    public interface IfaceService 
    { 
     [OperationContract] 
     int wordLen(string word); 
    } 

    public class StockService : IfaceService 
    { 
     public int wordLen(string word) 
     { 
      return word.Length; 
     } 
    } 
} 

Sin embargo, cuando estoy tratando de ejecutar él, explota un error:

WCF service host cannot find any service metadata...

Alguna idea de lo que podría ser?

archivo de configuración:

<system.serviceModel> 
    <services> 
     <service behaviorConfiguration="wcfLib.Service1Behavior" name="wcfLib.Service1"> 
     <endpoint address="" binding="wsHttpBinding" contract="wcfLib.ser"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8732/Design_Time_Addresses/wcfLib/Service1/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="wcfLib.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="False" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+5

¡Tiene que mostrarnos su archivo ** config **! Cosas como el intercambio de metadatos se definen en config –

+0

¿Y a qué URL intenta conectarse para obtener sus metadatos? ¿Cómo hospedas este servicio, IIS o autohospedado? –

+2

El código y la configuración de Yoru no coinciden: su servicio en el código es 'wcfLib.StockService' pero su etiqueta contiene' name = wcfLib.Service1' - ¡esos nombres deben coincidir! Lo mismo con el atributo 'contract =" wcfLib.ser "' en el punto final, ¡eso debe coincidir con el espacio de nombres + el nombre de la interfaz! ('wcfLib.IfaceService') –

Respuesta

23

Es necesario tener lo siguiente en su fichero de configuración:

1) un servicio comportamiento de metadatos:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="Metadata"> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

2) de referencia que el comportamiento del servicio en la configuración de su servicio

<service name="wcfLib.StockService" 
     behaviorConfiguration="Metadata"> 
    .... 
</service> 

* El valor del nombre en las etiquetas de servicio en el archivo de configuración debe tener el mismo nombre que la clase física que está implementando el contrato. Recuerde que si el nombre de la clase cambia, asegúrese de cambiar este valor para que coincida.

3) un punto final para MEX (intercambio de metadatos)

<service name="wcfLib.StockService" 
     behaviorConfiguration="Metadata"> 
    .... 

    <endpoint name="mex" 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
</service> 

Con todo esto en su lugar, las cosas deben estar muy bien! :-)

+0

Gracias! :) ¡Trabajos! – Rob

+3

tengo todo lo que mencionaste en la publicación anterior, aún obtengo el mismo error (cuadro de diálogo). –

0

forma predeterminada, Visual Studio se va a tratar de configurar un cliente/prueba ui para que juegues con tu nuevo servicio. Para hacerlo, debe conocer la estructura y los métodos que ofrece su servicio. Esto se logra consumiendo una definición en el formato WSDL estándar. Sin embargo, WCF no publicará estos datos por defecto.

Tiene que configurar un comportamiento de metadataexchange endpoint para acehive.

Cualquiera de publicar su archivo de configuración aquí y podemos ayudar, o Búsqueda de Google/pila para MetadataExchange y WSDL de WCF

0

Recibí este error porque el nombre de mi servicio era incorrecto. Usando netTcpBinding y mexTcpBinding con httpGetEnabled = False funcionó.

0
// get the <system.serviceModel>/<services> config section 
ServicesSection services = ConfigurationManager.GetSection("system.serviceModel/services") as ServicesSection; 

ServiceHost host = new ServiceHost(typeof(SelfHostedService.Service)); 

// enumerate over each <service> node 
foreach (ServiceElement aService in services.Services) 
{ 
    Console.WriteLine(); 
    Console.WriteLine("Name: {0}/Behavior: {1}", aService.Name, aService.BehaviorConfiguration); 

    // enumerate over all endpoints for that service 
    foreach (ServiceEndpointElement see in aService.Endpoints) 
    { 
     Console.WriteLine("\tEndpoint: Address = {0}/Binding = {1}/Contract = {2}", see.Address, see.Binding, see.Contract); 
     //host.AddServiceEndpoint(
    } 
} 

try 
{ 
    Console.WriteLine("Service EndPoints are: "); 
    foreach (ServiceEndpoint endpoint in host.Description.Endpoints) 
    { 
     Console.WriteLine("{0} ({1})", endpoint.Address.ToString(), endpoint.Binding.Name); 
    } 
    host.Open(); 

    Console.WriteLine(string.Concat("Service is host at ", DateTime.Now.ToString())); 
    Console.WriteLine("\n Self Host is running... Press <Enter> key to stop"); 
} 
catch(Exception ex) 
{ 
    Console.WriteLine(ex.Message.ToString()); 
} 

Si todavía no funciona tan eliminar el archivo de configuración actual y volver a crearlo con su nombre predeterminado App.config, esto es obras.

15

Tengo este mismo problema y estaba pasando por mi configuración vigorosamente y todo estaba en línea con los puntos finales de los metadatos, etc. ¿El problema?Esta línea:

<service behaviorConfiguration="wcfLib.Service1Behavior" name="wcfLib.Service1"> 

El valor name, el mosto de tener el nombre de la clase de física que está llevando a cabo el contrato. Olvidé ... una vez más y lo llamé arbitrariamente pensando que podría ser cualquier cadena. Entonces, en el caso anterior, la clase implementadora debe llamarse Service1. Si el nombre de la clase cambia, asegúrese de cambiar este valor.

Esto es como WCF 101 y sigo quemándome a pesar de que he estado haciendo WCF desde CTP en Framework 3.0. Bla ...

+0

Me olvidé de esto cuando seguí un tutorial que cambió la interfaz del servicio y los nombres de las clases. El uso de refactorización de código para cambiar el nombre habría evitado esto. – jingtao

+0

Gracias, esto fue muy, muy útil :) – TeaLeave

0

También puede obtener el mismo error si está creando su host de servicio mediante programación y olvida agregar los atributos [ServiceContract] y [OperationContract] al contrato de interfaz.

1

La manera más fácil de crear este problema es simplemente volver a factorizar el nombre de su interfaz. Ciertamente cambia el nombre de la instancia en su proyecto, pero no puede actualizar el archivo web.config. Para recrear cree un nuevo servicio, cambie el nombre de su interfaz y golpee F5, boom, aparece el cuadro de diálogo de metadatos :-) La respuesta es la anterior, solo recuerde alterar manualmente su archivo web.config.

Saludos

0

Sé que esto una vieja pregunta, pero pensé que le daría mis 2 centavos sobre el tema, ya que acaba de pasar a mí.

De alguna manera cambié mi Build Platform de "Any CPU" a "x86" para el propio servicio web. La segunda vez que lo cambié a "Cualquier CPU", resolvió el problema.

-1

He activado la activación de HTTP. Asegúrate de tenerlo puesto.

Ensure HTTP Activation is on

Cuestiones relacionadas