Domanda

Sto provando a consumare un servizio di riposo wcf tramite la riflessione, se possibile. Dai un'occhiata al codice qui sotto:

    public static object WCFRestClient<T>(string method, string uri, params object[] args)
    {        
        object o;
        object ret;
        using (ChannelFactory<T> cf = new ChannelFactory<T>(new WebHttpBinding(), uri))
        {                
            T contract = cf.CreateChannel();
            ret = contract.GetType().GetMethod(method).Invoke(o, args);

        }
        return ret;
    }

Come vedi è un metodo generico che richiede T in fase di esecuzione ... il mio problema è che non sono sicuro di poter davvero riflettere sull'oggetto canale che sto creando sopra ... Diciamo che lo faccio, quindi il problema inizia quando voglio creare un'istanza di oggetto ... Dal momento che non riesco a creare un'istanza di oggetto da un'interfaccia ...

Sarei anche felice di sapere se esiste un altro modo per farlo? Ma preferisco usare il meccanismo del canale se posso.

È stato utile?

Soluzione

In generale, creare un ChannelFactory per ogni operazione è costoso. Dovresti evitarlo, se possibile. Il modello using è anche problematico per i ICommunicationObject tipi in WCF, poiché Dispose() corrisponde generalmente a Close() che è una chiamata bloccante / che genera eccezioni. Dovrai chiamare TimeoutException esplicitamente invece e gestire CommunicationException e ChannelFactory<T>.CreateChannel.

A parte questo, il tuo approccio funzionerebbe. Se si utilizza T, verrà creato un oggetto proxy trasparente di tipo o che potrebbe essere richiamato tramite reflection se lo si desidera. Quindi non dovrai preoccuparti di creare un oggetto dall'interfaccia del contratto - WCF lo fa già.

Nell'esempio di codice, assicurati di sostituire contract con <=> e dovresti ottenere i risultati che ti aspetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top