Arhn - архитектура программирования

Был ли метод HttpContent.ReadAsAsync‹T› заменен в .NET Core?

Следующее относится к приложению .NET Core со следующими зависимостями...

Microsoft.NETCore.App
Microsoft.AspNet.WepApi.Client (5.2.7)

На Microsoft.com есть документ Call a Web API From a .NET Client (C#) от ноября 2017 года.

Ссылка... https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

В документе есть вызов HTTP GET на стороне клиента.

    static HttpClient client = new HttpClient();
    static async Task<Product> GetProductAsync(string path)
    {
        Product product = null;
        HttpResponseMessage response = await client.GetAsync(path);
        if (response.IsSuccessStatusCode)
        {
            product = await response.Content.ReadAsAsync<Product>();
        }
        return product;
    }

Значение response.Content относится к объекту HttpContent. По состоянию на июль 2020 г. у HttpContent нет метода экземпляра с сигнатурой ReadAsAsync<T>(), по крайней мере, согласно следующему документу. Однако этот метод экземпляра работает.

Ссылка на ссылку, где нет метода экземпляра с сигнатурой ReadAsAsync<T>()... https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpcontent?view=netcore-3.1

Существует статический метод HttpContentExtensions.ReadAsAsync<T>(myContent), где myContent относится к объекту HttpContent. Этот статический метод также работает.

Ссылка на ссылку... https://docs.microsoft.com/en-us/previous-versions/aspnet/hh834253(v=vs.118)

Например, одна задокументированная подпись имеет...

статический значок, за которым следует ReadAsAsync<T>(HttpContent)

и описание, в котором говорится, что он вернет Task<T>. Этот статический метод, вероятно, является закулисной реализацией метода экземпляра.

Однако в верхней части веб-страницы статического метода есть информация, указывающая... Мы больше не обновляем этот контент регулярно. Ознакомьтесь с жизненным циклом продукта Microsoft, чтобы узнать, как поддерживается этот продукт, услуга, технология или API.

Были ли заменены HttpContent.ReadAsAsync<T>() обеих форм, экземпляра и статики, в .NET Core 3.1?


  • Хотя документация сбивает с толку и не гарантирует, что ноябрь 2017 года должен работать, я решил принять ее как достаточно хороший пример для проекта .NET Core. 24.10.2020
  • Эта ссылка может представлять интерес с 28 июля 2020 года. /2020/07/28/ Цитата из него... Обратите внимание, что NuGet не рассказывает всей истории, поскольку библиотека System.Text.Json включена в общую платформу .NET Core 3.0, а для других целевых платформ разработчикам необходимо установить пакет NuGet System.Text.Json. 24.10.2020
  • На сегодняшний день в .Net Core 3.1 по-прежнему нет замены для ReadAsAsync‹T›.... Вам нужно создать свой собственный... или продолжать использовать ApiClient версии 5.2.7, который явно зависит от Newtonsoft JSON. 28.10.2020

Ответы:


1

Я не могу сказать по коду, был ли он когда-либо методом экземпляра, но, вероятно, так оно и было.

Ссылки, которые вы включили, чередуются между .net 4.x и .net core, неясно, знаете ли вы об этом. Обозначение их датами предполагает линейное развитие, но у нас есть развилка на дороге.

И все, его «понизили» до размещения в дополнительном пакете, потому что он будет меньше использоваться. В ядре .net у нас теперь есть аналогичные методы расширения, действующие непосредственно на HttpClient.


Чтобы использовать это с .net core 3.x, вам может потребоваться добавить пакет System.Net.Http.Json nuget. Расширения работают только с System.Text.Json, для Newtonsoft вам придется использовать традиционные шаблоны кода.


HttpClientJsonExtensions отсутствует в онлайн-документации .NET Core 3.1 по состоянию на июль 2020 г.

27.07.2020
  • Это хорошо знать. Однако в HttpClientExtensions я не вижу метода GET. Все они POST и PUT. docs.microsoft.com/en-us /предыдущие версии/aspnet/ 27.07.2020
  • Вы должны четко понимать, что хотите 4.x или ядро. Также есть запутанность с NewtonSoft vs System.Text.Json . 27.07.2020
  • В ядре .net у нас есть расширения HttpClientJson и GetFromJsonAsync<>(). 27.07.2020
  • Я хочу Кор. К сожалению, не на всех страницах документации есть раскрывающийся список для выбора только основной документации. Я посмотрю на HttpClientJsonExtensions, спасибо. 27.07.2020
  • HttpClientJsonExtensions отсутствует в .NET Core по состоянию на июль 2020 г. 27.07.2020
  • «Июль 2020» не является значимым индикатором версии. Вот последний (net 5) версия с раскрывающимся списком. 27.07.2020
  • Но вроде 3.1 не документирована, надо будет глянуть. 27.07.2020
  • Просто ложь.... Я только что создал проект, и он работает без упомянутых вами nugets..... 27.07.2020
  • Это просто заметка для тех, кто прочтет это в будущем. В июле 2020 года текущая версия .NET Core — 3.1. В будущем считается, что бренд Core будет отброшен, когда преемник будет называться .NET 5. В любом случае, это всего лишь идентификаторы, и поэтому они не так важны, как то, что сегодня для написания кросс-платформы вы должны выберите Основные библиотеки и сделайте VS целевым ядром, если вам не нужна предварительная предварительная версия .NET 5. Так как я не люблю превью, бренд Core для меня все же имеет значение. Может быть, я должен был упомянуть об этом раньше. 27.07.2020
  • По этой ссылке... visualstudiomagazine.com/articles/2020/07/ 28/ Кажется, что пользователям .NET Core 3.0 не нужно добавлять System.Text.Json, потому что он уже включен. 24.10.2020
  • Когда вы говорите, что воздействуете на HttpClient напрямую, вы имеете в виду .GetByteArrayAsync(), .GetStreamAsync(), .GetStringAsync(). Они не сравнимы с HttpContent.ReadAsAsync<T>(), потому что они не безопасны для типов и очень неудобны, если полезная нагрузка представляет собой дерево объектов. Если у вас есть безопасный метод HttpClient, сообщите мне об этом. 27.10.2020

  • 2

    Остальные ответы неверны.

    Метод ReadAsAsync является частью System.Net.Http.Formatting.dll.

    Который, в свою очередь, является частью nuget: Microsoft.AspNet.WebApi.Client

    Я только что создал новый консольный проект .Net Core 3.1 и добавил 2 nugets

    1. Ньютонсофт
    2. Microsoft.AspNet.WebApi.Client

    Я создал проект с .NET Core 3.1, вот несколько картинок: введите здесь описание изображения

    Вот мой файл проекта: введите здесь описание изображения

    Вот код, который я только что написал, который отлично компилируется:

    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Threading.Tasks;
    
    namespace Custom.ApiClient
    {
        internal static class WebApiManager
        {
            //private const string _requestHeaderBearer = "Bearer";
            private const string _responseFormat = "application/json";
    
            private static readonly HttpClient _client;
    
            static WebApiManager()
            {
    
                // Setup the client.
                _client = new HttpClient { BaseAddress = new Uri("api url goes here"), Timeout = new TimeSpan(0, 0, 0, 0, -1) };
    
                _client.DefaultRequestHeaders.Accept.Clear();
                _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_responseFormat));
    
                // Add the API Bearer token identifier for this application.
                //_client.DefaultRequestHeaders.Add(RequestHeaderBearer, ConfigHelper.ApiBearerToken);       
            }
    
            public static async Task<T> Get<T>()
            {
                var response = _client.GetAsync("api extra path and query params go here");
    
                return await ProcessResponse<T>(response);
            }
    
            private static async Task<T> ProcessResponse<T>(Task<HttpResponseMessage> responseTask)
            {
                var httpResponse = await responseTask;
    
                if(!httpResponse.IsSuccessStatusCode)
                    throw new HttpRequestException(httpResponse.ToString());
    
                var dataResult = await httpResponse.Content.ReadAsAsync<T>();
    
                return dataResult;
            }
        
        }
    }
    

    ОБНОВИТЬ:

    Чтобы устранить некоторую путаницу с зависимостями для пакета Microsoft.AspNet.WebApi.Client

    Вот изображение зависимостей, показывающее по состоянию на 27 октября 2020 г. зависимости, которые ясно показывают, что они зависят от Newtonsoft JSON 10 или выше. На сегодняшний день нет замены ReadAsAsync с использованием System.Text.Json... Так что вы можете использовать ApiClient + Newtonsoft Json или создать свой собственный с помощью System.Text.Json

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

    27.07.2020
  • Хорошо, это работает с NewtonSoft. Это может понадобиться для некоторой обратной совместимости, но System.Text.Json — это путь вперед, и в целом примерно на 20% быстрее. 27.07.2020
  • @HenkHolterman, если вы видите картинку, Microsoft.AspNet.WebApi.Client зависит от Newtonsoft, и это пакет, который он установил в соответствии с вопросом. Что касается того, чтобы быть быстрее, то это для некоторых сценариев... но для многих вещей System.Text.Json довольно незаконченный... Я бы не стал использовать его в производстве. В нем по-прежнему много шероховатостей. И, безусловно, самым стабильным сериализатором json для .net является Newtonsoft, у которого более 500 миллионов загрузок. 27.07.2020
  • Ваш код опирается на те же объекты, что и мой. В вашем коде используются HttpClient.GetAsync() и HttpConent.ReadAsAsync<T>(). Мой код работает без Newtonsoft, поэтому вполне вероятно, что ваш код не нуждается в Newtonsoft. 27.10.2020
  • @ H2ONaCl В этом ты ошибаешься. Пакет Microsoft.AspNet.WebApi.Client действительно зависит от Newtonsoft JSON..... Просто взгляните на список зависимостей..... ReadAsAsync‹T› зависит от Newtonsoft JSON, и на сегодняшний день нет замены для этого с помощью System. Text.Json... вам придется создать свой собственный. 28.10.2020
  • @H2ONaCl, кроме того, когда вы устанавливаете пакет Microsoft.AspNet.WebApi.Client 5.2.7, он автоматически устанавливает Newtonsoft JSON версии 10 в качестве зависимости ... Я рекомендую вам вручную обновить Newtonsoft JSON до последней версии. 28.10.2020
  • Хорошая информация. Спасибо. Удобно, что у Microsoft скрытая и автоматическая зависимость от Newtonsoft. Одной вещью меньше для установки. В разделе «Пакеты» в Microsoft.AspNet.WebApi.Client (5.2.7) есть элемент Newtonsoft.Json (10.0.1). 20.12.2020

  • 3

    Что-то, что я использовал недавно, мне пришлось установить Newtonsoft.Json

    string responseContent = await response.Content.ReadAsStringAsync();
    var productResult = JsonConverter.DeserializeObject<Product>(responseContent);
    

    На самом деле я нашел это в документах Microsoft о том, как использовать REST API, и это сработало. Ваш код в порядке с частью получения, если он имеет правильный Uri,

    Также что-то не так, мой код не был статичным

    27.07.2020
  • всего 2 цента любому, кто читает этот ответ. Это работает, но учтите, что он выделяет строку, что является ненужным шагом. 27.07.2020
  • product = JsonConverter.DeserialzeObject‹Product›(ждите ответа.Content.ReadAsStringAsync()); 27.07.2020
  • все еще выделяя строку 27.07.2020
  • Read as string будет читать содержимое в строку, а затем вы десериализуете эту строку в объект. Существует поддержка чтения потока непосредственно в объект, поэтому промежуточный шаг чтения в строку не требуется. 27.07.2020
  • Вы можете прочитать об этом здесь для поддержки newtonsoft: newtonsoft.com/json/help/ html/Performance.htm 27.07.2020
  • Зачем использовать строки, если нет намерения выполнять строковые операции, такие как конкатенация, подстрока, обрезка и т. д.? 27.07.2020

  • 4

    Если вы не хотите устанавливать сторонние пакеты nuget, несложно реализовать для этого метод расширения.

    Например, используя System.Text.Json:

    using System.Net.Http;
    using System.Text.Json;
    using System.Threading.Tasks;
    
    public static async Task<T> ReadAsAsync<T>(this HttpContent content) {
        string contentString = await content.ReadAsStringAsync();
        JsonSerializerOptions options = new JsonSerializerOptions {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase
        };
        return (T)JsonSerializer.Deserialize(contentString, typeof(T), options);
    }
    
    01.06.2021
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..