Любой способ создать оболочку С# HTTPClient для проекта WebAPI?

В предстоящем проекте мы планируем использовать ASP.NET WebAPI 2, чтобы предоставлять функциональные возможности службы как для наших веб-сайтов, так и для клиентов браузера.

Поскольку нам нужно как можно меньше «конечных точек», мы хотим, чтобы все вызовы, даже «внутренние», потребляли наши серверы из веб-служб WebAPI. (т.е. не просто напрямую создавать новый экземпляр контроллера)

Я ищу что-то, что поможет сгенерировать или создать «клиент» С#, который обертывает HTTPClient и доставляет строго типизированные «прокси». Аналогично WCF при создании прокси через «Добавить ссылку на новую службу».

Я читал другие вопросы, задающие аналогичные вопросы (как видно ЗДЕСЬ), но хотел задать более прямой вопрос, не связанный с MVC или проблемами тестирования.


person BoxOfNotGoodery    schedule 21.10.2013    source источник
comment
Это лучшее представление того, что я искал: faniereynders.com/ 2013/03/aspnet-web-api.html Надеюсь, что это может быть официально опубликовано позже...   -  person BoxOfNotGoodery    schedule 22.10.2013
comment
Обновление: AutoRest github.com/Azure/autorest   -  person BoxOfNotGoodery    schedule 20.07.2018


Ответы (4)


Это лучшее представление того, что я искал:

Веб-API ASP.NET ‹#= Прокси-сервер для T4 #>

Введение в WebApiProxy : Предоставление прокси-серверов JavaScript и C# с Intellisense, включая документацию для веб-API ASP.NET

Он разместил свой пример кода на github:

https://github.com/RestCode/WebApiProxy

Надеюсь, что это может выйти в официальном виде позже.

person BoxOfNotGoodery    schedule 28.10.2013

В настоящее время я работаю над цепочкой инструментов Swagger с открытым исходным кодом для .NET. С помощью этих инструментов вы можете выбрать контроллер веб-API из существующей библиотеки DLL и создать спецификацию Swagger или клиентский код для C# и TypeScript. При использовании шаблонов T4 в Visual Studio процесс генерации работает как ссылки на службы WCF.

Посмотрите здесь: http://NSwag.org

введите здесь описание изображения

person Rico Suter    schedule 25.09.2015
comment
Это выглядит интересно. Насколько сложно было бы добавить поддержку VB? - person InteXX; 27.01.2017
comment
Эта функция не планируется, но есть инструменты для конвертации c# в vb.net. - person Rico Suter; 25.02.2017
comment
Я думаю, теперь, с появлением Roslyn, такой шаг можно было бы даже автоматизировать. Похоже, вы создали хорошую утилиту — продолжайте в том же духе. - person InteXX; 25.02.2017

Наиболее распространенный способ предоставления простой в использовании функциональности веб-API, который я видел, — это иметь сборку, которая определяет основные классы, а также некоторые функции публикации. Эта сборка использует JSON для передачи данных.

Посмотрите, как работает интегрированный API PayPal. По сути, они дают вам сборку, содержащую определения для различных используемых классов. Есть класс для передачи данных на сервер.

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

person NotMe    schedule 21.10.2013
comment
Я считаю, что основная проблема заключается в сопоставлении относительных uris различных сервисов и соответствующих методов, чтобы вместо общего набора методов, принимающих uris, вы получали большой набор методов, когда один метод соответствует одному вызову API. Вопрос не в том, возможно ли это, по-видимому, так как такой API-оболочка может быть легко написан вручную, а в том, как его автоматически сгенерировать, используя существующий подход. - person Wiktor Zychla; 21.10.2013

Я бы сказал, что вам действительно не нужна полноценная библиотека для доступа к данным; если у вас есть объекты данных, определенные в общей библиотеке, вы можете использовать общие вспомогательные методы, чтобы сделать что-то вроде

    public static TItem GetItem<TItem>(this HttpClient httpClient, string queryString) where TItem : class
    {
        var response = httpClient.GetAsync(queryString).Result;
        if (response.IsSuccessStatusCode)
        {
            return response.Content.ReadAsAsync<TItem>().Result;
        }

        throw new HttpRequestException(response.ToString());
    }

но измените свою собственную обработку ошибок и т. д.

person Allan Elder    schedule 21.10.2013