Использование сервиса .net wcf rest с помощью рефлексии

StackOverflow https://stackoverflow.com/questions/1619139

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать службу отдыха 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 во время выполнения ... моя проблема в том, что я не уверен, смогу ли я действительно отразить объект канала, который я создаю выше .... Допустим, я это делаю, тогда проблема начинается, когда я хочу создать экземпляр объекта ... Так как я не могу создать экземпляр объекта из интерфейса ...

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

Это было полезно?

Решение

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

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

В своем примере кода замените contract на <=>, и вы получите ожидаемые результаты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top