2010-01-16 26 views
36

Soy relativamente nuevo en WCF. Sin embargo, necesito crear un servicio que exponga datos a las aplicaciones cliente de Silverlight y AJAX. En un intento de lograr esto, he creado el siguiente servicio para servir como una prueba de concepto:WCF - El nombre del contrato no se pudo encontrar en la lista de contratos

[ServiceContract(Namespace="urn:MyCompany.MyProject.Services")] 
public interface IJsonService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", 
       RequestFormat=WebMessageFormat.Json, 
       ResponseFormat = WebMessageFormat.Json)] 
    List<String> JsonFindNames(); 
} 

[ServiceContract(Namespace="urn:MyCompany.MyProject.Services")] 
public interface IWsService 
{ 
    [OperationContract(Name="FindNames")] 
    List<String> WsFindNames(); 
} 


[ServiceBehavior(Name="myService", Namespace="urn:MyCompany.MyProject.Services")] 
public class myService : IJsonService, IWsService 
{ 
    public List<String> JsonFindNames() 
     { return FindNames(); } 
    public List<String> WsFindNames() 
     { return FindNames(name); } 
    public List<string> FindNames() 
    { 
     List<string> names = List<string>(); 
     names.Add("Alan"); 
     names.Add("Bill"); 
     return results; 
    }   
} 

Cuando intento acceder a este servicio, recibo el siguiente error:

El nombre de contrato ' myService 'no se pudo encontrar en la lista de contratos implementados por el servicio' myService '.

¿Cuál es la causa de esto? ¿Cómo puedo solucionar esto?

Gracias

Respuesta

55

Su contrato no es la interfaz de la aplicación.

En alguna parte de la configuración, ha escrito myService en lugar de IJsonService.

1

Tuve el mismo problema, pero mi solución fue que en mi web.config, estaba especificando el nombre completo de la clase (incluido el espacio de nombres), mientras que WCF solo aceptaba un nombre de clase.

Esto no funcionó:

<services> 
    <service name="BusinessServices.Web.RfsProcessor"> 

Esto funcionó:

<services> 
    <service name="RfsProcessor"> 
+0

Acabo de eliminar mi espacio de nombres, tratando de resolver el mismo problema que el OP, y mi servicio desapareció. – ProfK

+0

Esto no es correcto. El espacio de nombres es obligatorio. El montaje es ** no **. –

9

Retire el espacio de nombres del nombre del servicio. Funcionará bien.

3

Modificar su web.config puede encontrar <services> etiqueta y por debajo de esta etiqueta que tiene que tener otras dos etiquetas:

<service .... Y <endpoint ....

En <endpoint> etiqueta que tiene que hacer referencia a la interfaz de tu clase

Por ejempl: Si su clase de servicio nombrado CustomerSearch y su interfaz llamada ICustomerSearch que tiene en las configuraciones de esta manera:

<service name="CustomerSearch" behaviorConfiguration="ServiceBehavior"> 
    <endpoint address="" binding="webHttpBinding" contract="ICustomerSearch" 
      behaviorConfiguration="ServiceAspNetAjaxBehavior"> 
0

En el archivo web.config, name atributo del elemento <service tiene que ser el nombre del tipo de servicio con el espacio de nombres, pero no el conjunto (Namespace1.Namespace2.Class). El atributo <endpoint del elemento contract tiene similarmente el tipo de interfaz de espacio de nombres calificado - Namespace1.Namespace2.Interface.

Esto también resuelve todas las travesuras de comportamiento, como CreateBehavior que no se invoca en BehaviorExtensionElement.

0

He tenido ese error antes para ServiceModel framework 3.5, y verifiqué el archivo de configuración de mi host. Descubrí que era mi error de cortar y pegar. Mi servicio apuntaba a un viejo servicio no existente que el que estoy usando.Comienza a funcionar de nuevo después corregí estas líneas como a continuación:

<system.serviceModel> 
<services> 
    <!--<service name="NotUsed.Serv">--> 
    <service name="InUse.MyService"> 
    <host> 
     <baseAddresses> 
     <!--<add baseAddress="http://localhost:8181/LastService" />--> 
     <add baseAddress="http://localhost:8181/InUseService"/> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
</system.serviceModel> 

Tenga en cuenta que MyService tiene que ser el nombre de su clase en el contrato ServiceModel 3,5 PERO ES IMyService interfaz contrato en el marco 4.0 ->

namespace InUse { 
[ServiceContract] 
public interface IMyService 
{ 
    [WebGet(UriTemplate = "/GetList/{PATTERN}", 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json)] 
    [OperationContract] 
    List<string> GetIDListByPattern(string PATTERN); 

} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]  
public class MyService : IMyService 
{   
    List<string> MySample = (new _PointRT()).Sample().Select(r=>r._pointXID).ToList(); 

    public List<string> GetIDListByPattern(string PATTERN) { 
     return MySample.Where(x => x.Contains(PATTERN)).ToList(); 
    } 
} 
Cuestiones relacionadas