6.3内容转换器(内置)

IHttpContentConverter 用于将 HTTP 远程请求返回的 HttpResponseMessage 对象转换成目标类型。如下图所示:

IHttpContentConverter 内容转换器#

IHttpContentConverter 用于将 HTTP 远程请求返回的 HttpResponseMessage 对象转换成目标类型。如下图所示:

查看高清架构图

内置内容转换器#

  • StringContentConverter 内容转换器

当目标接收类型为字符串时,将使用 StringContentConverter 来将 HttpResponseMessage 对象转换为字符串。该转换过程内部调用了 HttpResponseMessage.Content 提供的 ReadAsStringAsync 方法来实现。


  • StreamContentConverter 内容转换器

当目标接收类型为 Stream 时,将使用 StreamContentConverter 来将 HttpResponseMessage 对象转换为 Stream。该转换过程内部调用了 HttpResponseMessage.Content 提供的 ReadAsStreamAsync 方法来实现。


  • ByteArrayContentConverter 内容转换器

当目标接收类型为字节数组时,将使用 ByteArrayContentConverter 来将 HttpResponseMessage 对象转换为字节数组。该转换过程内部调用了 HttpResponseMessage.Content 提供的 ReadAsByteArrayAsync 方法来实现。


  • HttpResponseMessageConverter 内容转换器

当目标接收类型为 HttpResponseMessage 时,将使用 HttpResponseMessageConverter 来将 HttpResponseMessage 对象直接返回。


  • VoidContentConverter 内容转换器

当目标接收类型为 voidVoidContent 时,将使用 VoidContentConverter 来返回空值(无返回值)。


  • IActionResultContentConverter 内容转换器

当目标接收类型为 IActionResult 时,将使用 IActionResultContentConverter 来将 HttpResponseMessage 对象转换为 IActionResultContentConverter


  • AsyncEnumerableContentConverter<T> 内容转换器

当目标接收类型为 IAsyncEnumerable<T> 时,将使用 AsyncEnumerableContentConverter<T> 来将 HttpResponseMessage 对象转换为 IAsyncEnumerable<T>。该转换过程内部调用了 HttpResponseMessage.Content 提供的 ReadFromJsonAsAsyncEnumerable 方法来实现。


  • HttpRemoteResult<T> 内容转换器

当目标接收类型为 HttpRemoteResult<T> 时,将使用 HttpRemoteResultContentConverter<T> 来将 HttpResponseMessage 对象转换为 HttpRemoteResult<T>。该转换过程内部调用了 IHttpContentConverterFactory 提供的 ReadAsync 方法来实现。


  • ObjectContentConverter 内容转换器

当目标接收类型不为特定类型,例如自定义类型、基本数据类型(如 intbool 等)在内的多种类型,将使用 ObjectContentConverter 来将 HttpResponseMessage 对象转换为目标接收类型。该转换过程内部调用了 HttpResponseMessage.Content 提供的 ReadFromJsonAsync 方法来实现。

IHttpContentConverterFactory 内容转换器工厂#

IHttpContentConverterFactory 内容转换器工厂负责根据目标接收类型,确定合适的 IHttpContentConverter 内容转换器,并调用其 Read 方法来将 HttpResponseMessage 对象转换为目标接收类型。该工厂服务被配置为单例模式,以确保其在应用程序生命周期中的唯一性和稳定性。

如果未找到匹配的 IHttpContentConverter 内容处理器,系统会回退到使用 IObjectContentConverterFactory 对象内容转换器工厂来进行转换,其内部通过返回 ObjectContentConverter() 实例进行转换。

以下是使用 IHttpContentConverterFactory 内容转换器工厂与 HttpClient 结合的示例,展示了如何通过其 Read 方法轻松将 HttpResponseMessage 对象转换为目标类型实例。

cs
public class YourService(IHttpContentConverterFactory httpContentConverterFactory)  // .NET8+ 支持主构造函数注入{    public async Task<string?> GetStringAsync()    {        var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "https://furion.net/");        using var httpClient = new HttpClient();        var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage);        // 调用 Read 方法将 HttpResponseMessage 对象转换为目标类型实例        var context = new HttpContentConverterContext(httpResponseMessage);        return await httpContentConverterFactory.GetConverter<string>(context).ReadAsync(context);    }}

IObjectContentConverterFactory 对象内容转换器工厂#

IHttpContentConverterFactory 内容转换器工厂未找到匹配的 IHttpContentConverter 内容处理器,系统会回退到使用 IObjectContentConverterFactory 对象内容转换器工厂来进行转换,其内部通过返回 ObjectContentConverter() 实例进行转换。该工厂服务被配置为单例模式,以确保其在应用程序生命周期中的唯一性和稳定性。

以下是使用 IObjectContentConverterFactory 内容转换器工厂与 HttpClient 结合的示例,展示了如何通过其 Read 方法轻松将 HttpResponseMessage 对象转换为目标类型实例。

cs
public class YourService(IObjectContentConverterFactory objectContentConverterFactory)  // .NET8+ 支持主构造函数注入{    public async Task<string> GetStringAsync()    {        var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "https://furion.net/getuser/100");        using var httpClient = new HttpClient();        var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage);        // 调用 GetConverter<TResult>(new HttpContentConverterContext(httpResponseMessage)) 方法获取对象内容转换器实例        // 随后调用 Read 方法将 HttpResponseMessage 对象转换为目标类型实例        var context = new HttpContentConverterContext(httpResponseMessage);        return await objectContentConverterFactory.GetConverter<string>(context).ReadAsync<string>(context);    }}