Использование сервиса .net wcf rest с помощью рефлексии - PullRequest
1 голос
/ 25 октября 2009

Я пытаюсь использовать службу отдыха wcf через отражение, если это возможно. Посмотрите на код ниже:

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

Как вы видите, это универсальный метод, который принимает T во время выполнения ... моя проблема в том, что я не уверен, смогу ли я реально отразить объект канала, который я создаю выше .... Допустим, я это делаю, тогда проблема начинается, когда я хочу создать экземпляр объекта ... Так как я не могу создать экземпляр объекта из интерфейса ...

Я также был бы рад услышать о том, есть ли другой способ сделать это? Но я предпочитаю использовать канальный механизм, если смогу.

1 Ответ

2 голосов
/ 25 октября 2009

Как правило, создание ChannelFactory для каждой операции стоит дорого. Вам следует избегать этого, если это возможно. Шаблон using также проблематичен для типов ICommunicationObject в WCF, поскольку Dispose() обычно соответствует Close(), который является вызовом блокировки / исключения. Вместо этого вы захотите явно вызвать Close() и обработать TimeoutException и CommunicationException.

Помимо этого, ваш подход будет работать. Если вы используете ChannelFactory<T>.CreateChannel, он создаст прозрачный прокси-объект типа T, который может быть вызван через отражение, если вы хотите. Так что вам не придется беспокоиться о создании объекта из интерфейса контракта - WCF уже делает это.

В вашем примере кода обязательно замените o на contract, и вы получите ожидаемые результаты.

...