Любой способ сгенерировать обертку С# HTTPClient для проекта WebAPI?

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

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

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

Я читал другие вопросы, задавая похожие вещи (как видно HERE), но хотел задать более прямой вопрос, не связанный с MVC или проблемами тестирования.

Ответ 1

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

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

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

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

https://github.com/RestCode/WebApiProxy

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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