Любой легкий способ создать клиент WCF REST, публикующий URL-запросы? - PullRequest
4 голосов
/ 20 февраля 2012

Это дубликат http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/94503037-9cc4-494d-88af-4e97fcb9cdcc,, но у меня не было особого успеха, получая там полезные ответы. (

Я пытался найти информацию о том, как получить красивый конкретный клиент службы REST (прокси) от ChannelFactory.

Насколько я понял, вы можете установить attirubtes на клиентском интерфейсе, который говорит WCF использовать XML (DataContract или XmlSerialization) или JSON для ответов и HTTP-запросы на получение в формате URL или HTTP-сообщение XML / JSON. [править из оригинала] И, конечно, предоставляя различные конфигурации привязки либо программно, либо через config. [/ редактировать из оригинала]

Я хотел бы добавить некоторые атрибуты в интерфейс службы, указывающие WCF создать POST в формате URL без заголовка XML, а затем получить ответ в формате XML. (Например) [редактировать из оригинала] И / или предоставлять привязки BCL, поддерживающие завершение [/ редактировать из оригинала]

Сценарий сна был бы таким:

public interface IRestClient
{
    [WebInvoke]
    AuthResponse Authorize(
        [HeaderParameter]
        string someHeader,
        string someData, 
        int someInt)
}

// ...

var client = channelFactory.CreateChannel<IRestClient>(); // whatever bindings I'd need for this

var response = client.Authorize("abc", "def", 123);

И есть клиент. Авторизуйтесь на самом деле

HTTP POST /authorize
someHeader: abc
someData=def&someInt=123

И десериализовать

<AuthResponse>
    <Message>Hi there!</Message>
</AuthResponse>

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

Библиотека материалов WCF, примеры WCF и др. и др. это слишком академично и имеет слишком много слесарного дела и / или слишком мало интуитивной документации для меня, чтобы сделать это без боли. :)

Любые подсказки, где я могу найти самый простой способ сделать это?

(И, пожалуйста, не говорите мне использовать HttpRequest или WebClient, поэтому у нас есть ChannelFactory!;))

[обновление]

Поправьте меня, если я ошибаюсь, но, насколько я понимаю, многие из так называемых REST API требуют запросов в формате URL, а не Json или Xml.

Интерпретация WCF веб-интерфейсов сервисов отражает атрибуты WebGet и WebInvoke в определениях методов, чтобы определить, как вызывать каждый "метод" в "сервисах". (Позвольте мне назвать это методом и службой для простоты)

Атрибут WebInvoke принимает значение перечисления WebRequestFormat для определения способа сериализации запросов. Это перечисление имеет только Json и Xml.

Мне кажется очень глупым, что это перечисление, а не какой-то указатель на фабрику форматирования / сериализатора или даже конкретное из сказанного.

Итак, вопрос действительно сводится к самому простому, предпочтительно уже реализованному, переопределению сериализации запросов.

[/ обновление]

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

REST не имеет стандарта метаданных. Поэтому вам придется самостоятельно прокрутить свой клиентский код с помощью одного из множества клиентских REST-инструментов или базовых HTTP API в BCL. Вы можете использовать WebChannelFactory для определения взаимодействия с WebInvoke, WebGet, но вам придется написать это самостоятельно или взять копию служебного.

Обычно в API REST API должен быть динамически обнаруживаемым с точки зрения URI, поскольку ресурсы должны также возвращать соответствующие URI и глаголы, которые применимы для текущего состояния вашего взаимодействия или ресурса

0 голосов
/ 15 сентября 2014

Убедитесь, что запрос и ответ находятся в вашем любимом формате.

var client = channelFactory.CreateChannel<IRestClient>(); // whatever bindings I'd need for this

    System.ServiceModel.Description.WebHttpBehavior behaviour = new System.ServiceModel.Description.WebHttpBehavior();
    behaviour.DefaultOutgoingRequestFormat = System.ServiceModel.Web.WebMessageFormat.Json;
    behaviour.DefaultOutgoingResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json;
    client.Endpoint.Behaviors.Add(behaviour);
    m_Proxy = client.CreateChannel();


var response = m_Proxy.Authorize("abc", "def", 123);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...