2014-10-28 15 views
8

Inserirò questa domanda anche se vedo che ce ne sono poche altre simili a questa. Tuttavia, non sono in grado di trovare una soluzione soddisfacente né sul perché ottengo questo errore né su come risolverlo.Errore: non supportato nel client di test WCF perché utilizza il tipo System.Threading.Tasks

Così, oggi ho dovuto ospitare un servizio sul mio computer locale a scopo di test. Il servizio è una soluzione di servizio WCF unica e funziona da molto tempo. Tuttavia quando ho scaricato il progetto e ho cercato di ospitare il servizio sulla mia macchina locale ho ottenuto l'errore dal titolo:

Questa operazione non è supportata nel client di prova WCF perché utilizza tipo System.Threading

Così quando sono tornato a casa ho deciso di creare un servizio utilizzando alcuni metodi asincroni e andare fino in fondo. Tuttavia sono rimasto davvero sorpreso quando ho ottenuto esattamente lo stesso errore su un progetto quasi vuoto che non sta usando (o almeno sembra così) lo System.Threading.Tasks ovunque.

Quindi quello che ho fatto:

  • Creato nuovo WCF Service utilizzando Visual Studio 2013 modello predefinito
  • sinistra il file di default IService1.cs e Service1.svc
  • Cambiato il IService1.cs a:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Runtime.Serialization; 
    using System.ServiceModel; 
    using System.ServiceModel.Web; 
    using System.Text; 
    
    namespace WcfService 
    { 
        [ServiceContract] 
        public interface IService1 
        { 
         [OperationContract] 
         int GetEmpId(int id); 
        } 
    } 
    
    • Modificato il Service1.svc in:

      utilizzando Sistema; utilizzando System.Collections.Generic; utilizzando System.Linq; utilizzando System.Runtime.Serialization; utilizzando System.ServiceModel; utilizzando System.ServiceModel.Web; usando System.Text;

      namespace WcfService { public class Service1: IService1 {public int GetEmpId (int id) { ritorno id; }} }

E lasciando il default web.config che assomiglia a questo:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 

non ho nemmeno cercato di utilizzare Task, Threading o qualcosa del genere, basta volevo vedere che il mio servizio è attivo e funzionante, così posso iniziare ad aggiungere cose e vedere esattamente quando riceverò l'errore ma per la mia sorpresa dopo aver impostato Service1.svc come mio avvio classe e cercando di eseguire il progetto ho ottenuto lo stesso errore:

Questa operazione non è supportata nel client di verifica WCF perché utilizza il tipo Sistema.Threading

Ok, ora sono completamente perso. Stavo ricevendo questo errore dopo diversi tentativi di eseguire il mio progetto. Poco prima di postare questa domanda ho provato di nuovo e questa volta non ho ricevuto l'errore. In effetti ho appena finito il mio cliente e sono in grado di consumare il metodo GetEmpId().

Quindi cosa sta succedendo qui. Si tratta di screenshot quando costruire il mio progetto:

Service

Non ho metodo GetEmpIdAsync(). Non ho provato ad aggiungerlo. E come mai non si costruirà più volte e ora tutto ad un tratto sono in grado di utilizzare il metodo che ho effettivamente implementato fin dall'inizio?

risposta

9

WCF esporrà automaticamente un'interfaccia sia sincrona sia asincrona per ciascuno dei metodi. Entrambi questi metodi chiamano in modo sincrono GetEmpId sul lato server, la differenza è attesa in attesa che il risultato sia sincrono o asincrono sul lato client.

Se avete fatto la vostra classe di essere

public class Service1 : IService1 
{ 
    public Task<int> GetEmpIdAsync(int id) 
    { 
     return Task.FromResult<int>(id); 
    } 
} 

si dovrebbe ancora vedere int GetEmpId(int id) sullo strumento di prova. WCF è abbastanza intelligente da associare le due versioni alla stessa funzione.

"L'errore" che si sta vedendo è solo una limitazione dello strumento di test che viene fornito con Visual Studio, entrambe le funzioni chiamano la stessa funzione lato server quindi non c'è forza convincente per rendere Microsoft aggiungere supporto. Non c'è nessun errore reale. Se vuoi veramente testare la versione asincrona dovrai scrivere il tuo client di test che chiama la funzione.

+0

Grazie per la spiegazione. Il servizio è stato realizzato anni fa e il fatto che ricevessi errori mi confondeva di più poiché so che questo servizio funzionava da molto tempo. Non ho intenzione di usarlo in modalità asincrona, al contrario mi chiedo davvero perché la MS avrebbe fatto una tale convenzione. Almeno per me, dal momento che sto usando 'WCF' raramente mi sembra davvero strano e confuso. Immagino che sia qualcosa che viene fornito con le versioni più recenti di 'Visual Studio' ... Comunque, grazie ancora. – Leron

+0

Btw, c'è un modo per "dire" allo strumento di cercare solo i metodi di sincronizzazione, quindi non ottengo quei messaggi? – Leron

+1

Questo strumento di test, io non la penso così. Tuttavia se stai usando [SvcUtil] (http://msdn.microsoft.com/en-us/library/aa347733 (v = vs.110) .aspx) per generare la tua interfaccia devi solo lasciare '/ async' oppure se stai usando la GUI "Aggiungi Service Refrence", fai semplicemente clic su "Avanzate", quindi deseleziona la casella "[Consenti generazione di operazioni asincrone] (http://i.stack.imgur.com/GNsK0.png)" –

Problemi correlati