2010-01-16 22 views
36

Sono relativamente nuovo a WCF. Tuttavia, ho bisogno di creare un servizio che esponga i dati a entrambe le applicazioni client Silverlight e AJAX. Nel tentativo di raggiungere questo obiettivo, ho creato il seguente servizio per servire come una prova di concetto:WCF: impossibile trovare il nome contratto nell'elenco dei contratti

[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; 
    }   
} 

Quando provo ad accedere a questo servizio, ricevo il seguente errore:

Il nome del contratto ' myService 'non è stato trovato nell'elenco dei contratti implementati dal servizio' myService '.

Qual è la causa di questo? Come posso risolvere questo?

Grazie

risposta

55

Il tuo contratto non è l'implementazione.

Da qualche parte nella configurazione è stato scritto myService anziché IJsonService.

1

Ho avuto lo stesso problema, ma la mia soluzione era che nel mio web.config stavo specificando l'intero nome della classe (incluso lo spazio dei nomi), mentre WCF accetterebbe solo un nome di classe.

Questo non ha funzionato:

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

questo ha funzionato:

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

Ho appena rimosso il mio spazio dei nomi, cercando di risolvere lo stesso problema dell'OP, e il mio servizio è svanito. – ProfK

+0

Questo non è corretto. Lo spazio dei nomi è richiesto. L'assemblaggio è ** non **. –

9

Rimuovere lo spazio dei nomi dal nome del servizio. Funzionerà bene.

3

Modifica la web.config Potete trovare <services> tag e al di sotto di questo tag è necessario disporre di altri due tag:

<service .... E <endpoint ....

In <endpoint> tag si deve fare riferimento per interfacciare della tua classe.

Per exampl: Se la vostra classe di servizio denominata CustomerSearch e la vostra interfaccia denominata ICustomerSearch bisogna config in questo modo:

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

Nel file web.config, l'attributo dell'elemento <servicename deve essere il nome del tipo di servizio con lo spazio dei nomi, ma non l'assembly (Namespace1.Namespace2.Class). L'attributo contract dell'elemento <endpoint ha un tipo di interfaccia qualificato per lo spazio dei nomi - Namespace1.Namespace2.Interface.

Questo risolve anche tutti i comportamenti shenanigans, come CreateBehavior non invocati su BehaviorExtensionElement.

0

Ho avuto questo errore prima per ServiceModel framework 3.5 e ho controllato il file di configurazione del mio host. Ho scoperto che era il mio errore di taglia e incolla. Il mio servizio puntava a un vecchio servizio non esistente rispetto a quello che sto usando.Si inizia a lavorare di nuovo dopo ho corretto queste righe, come di seguito:

<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> 

Nota che MyService deve essere il nome della classe contratto in ServiceModel 3.5 MA È IMyService interfaccia contratto Framework 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(); 
    } 
} 
Problemi correlati