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内容转换器
当目标接收类型为 void 或 VoidContent 时,将使用 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内容转换器
当目标接收类型不为特定类型,例如自定义类型、基本数据类型(如 int、bool 等)在内的多种类型,将使用 ObjectContentConverter 来将 HttpResponseMessage 对象转换为目标接收类型。该转换过程内部调用了 HttpResponseMessage.Content 提供的 ReadFromJsonAsync 方法来实现。
IHttpContentConverterFactory 内容转换器工厂#
IHttpContentConverterFactory 内容转换器工厂负责根据目标接收类型,确定合适的 IHttpContentConverter 内容转换器,并调用其 Read 方法来将 HttpResponseMessage 对象转换为目标接收类型。该工厂服务被配置为单例模式,以确保其在应用程序生命周期中的唯一性和稳定性。
如果未找到匹配的 IHttpContentConverter 内容处理器,系统会回退到使用 IObjectContentConverterFactory 对象内容转换器工厂来进行转换,其内部通过返回 ObjectContentConverter() 实例进行转换。
以下是使用 IHttpContentConverterFactory 内容转换器工厂与 HttpClient 结合的示例,展示了如何通过其 Read 方法轻松将 HttpResponseMessage 对象转换为目标类型实例。
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 对象转换为目标类型实例。
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); }}