Создайте прокси-сервер WCF для веб-службы Rest

#.net #wcf #rest #wcf-rest

#.net #wcf #rest #wcf-rest

Вопрос:

У меня есть сложная служба WCF Rest, которая принимает несколько входных данных и объектов. Я не могу просто вызвать его, выполнив HTTP POST в Fiddler, потому что требуется предоставить слишком много данных (я мог бы, но это займет у меня целую вечность). Итак, я хотел бы сделать это в коде, используя прокси. Есть ли способ создать прокси-сервер для службы .NET 4 WCF Rest? В противном случае, что вы предлагаете, чтобы я мог легко протестировать службу?

Спасибо.

Ответ №1:

Не существует стандартного способа создания прокси-сервера для службы WCF REST (для REST не существует WSDL, один из новых стандартов, WADL, не получил широкого распространения, и WCF его не поддерживает). В целях тестирования вам следует предоставить общий доступ к интерфейсу клиенту и либо использовать ChannelFactory<T> — и задать соответствующее поведение в свойстве конечной точки фабрики, либо использовать вспомогательный класс WebChannelFactory<T>, который сделает это за вас.

Предполагая, что интерфейс называется ITest, это то, что у вас было бы:

 Uri serviceUri = new Uri("http://my.service.com/endpoint");
WebChannelFactory<ITest> factory = new WebChannelFactory<ITest>(serviceUri);
ITest proxy = factory.CreateChannel();
Assert.AreEqual(9, proxy.Add(4, 5));
  

Ответ №2:

Хотя в настоящее время не существует стандартного способа создания прокси-сервера с помощью службы WCF REST, вы можете сделать это с помощью инструмента «Вставить XML как типы» в REST Starter kit. Это удаляет xml, показанный на странице WCF / help по умолчанию, и создает класс C #, который соответствует структуре и может быть использован. Кроме того, посмотрите это видео, чтобы увидеть его в действии — Пользовательский Twitter за 3 минуты.

Ответ №3:

Вы можете создать прокси, используя те же шаги, что и для службы WCF, не поддерживающей RESTful:

 // Create the proxy
ChannelFactory<IContract> channelFactory = new ChannelFactory<IContract>("endpointName");
var restfulProxy = factory.CreateChannel();

// Invoke a method
var response = proxy.MyRestfulMethod("param1", "param2");
  

Комментарии:

1. Это сработает, если «конечная точка», определенная в конфигурации, правильно установлена с соответствующей привязкой (например, webHttpBinding) и поведением (например, WebHttpBehavior), но для целей тестирования я обнаружил, что обычно проще хранить всю информацию в одном месте (коде).

Ответ №4:

svcutil.exe создаст класс прокси, который вы можете использовать в вызывающем приложении, что позволит вам вызывать соответствующие методы и передавать параметры в коде

Комментарии:

1. svcutil не работает для конечных точек REST — он не понимает такие атрибуты, как [WebGet] или [WebInvoke], поскольку они не отображаются в WSDL / метаданных службы.