【问题标题】:HttpClient- No mediatypeformatter is available to read an object of type 'Model'HttpClient - 没有 mediatypeformatter 可用于读取“模型”类型的对象
【发布时间】:2019-01-19 21:47:08
【问题描述】:

我正在使用带有 .net core 2.1 的 httpclient。现在的问题是当我尝试从 url 获取数据时,我收到错误“没有 mediatypeformatter 可用于读取'Model'类型的对象”。该代码在其他地方运行良好,但在这里我遇到了异常。代码如下:

            string url = uri;
            _httpClient.BaseAddress = new Uri(somestring);
            _httpClient.DefaultHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var response = await _httpClient.GetAsync(url);
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsAsync<MyModel>();

如果我使用 response.Content.ReadAsStringAsync() 并使用 JsonConvert 反序列化字符串,则它可以正常工作,但我认为 _httpClient 不是那么灵活。在使用 restsharp 之前很长一段时间我也遇到过这个问题,但后来我使用了“application/json; charset=utf-8”,它开始正常工作。那么有没有办法在 httpclient content-type header 中添加 charset=utf-8 呢?

【问题讨论】:

  • _httpClient.DefaultHeadersContent.ReadAsAsync 使用的参考是什么?我在Core 2.1 中使用HttpClient 进行了测试。我需要引用Microsoft.AspNet.WebApi.Client 才能使用Content.ReadAsAsync,并且只有DefaultRequestHeaders 而不是DefaultHeaders。我无法在答案中重现您的问题。

标签: asp.net asp.net-core httpclient asp.net-core-2.0


【解决方案1】:

我用下面的代码做了一个测试,我建议你做一个测试:

        HttpClient client = new HttpClient();

        var response = await client.GetAsync(@"https://localhost:44342/Products");
        response.EnsureSuccessStatusCode();
        var result = await response.Content.ReadAsAsync<Product>();

由于它适用于JsonConvert,我建议您尝试为Content 实现扩展方法以解决问题。

public static class HttpContentExtensions
    {
        public static async Task<T> ReadAsJsonAsync<T>(this HttpContent content)
        {
            string json = await content.ReadAsStringAsync();
            T value = JsonConvert.DeserializeObject<T>(json);
            return value;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2018-05-29
    • 2012-09-12
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多