6.1内容处理器(内置)
IHttpContentProcessor 用于根据用户设置的原始请求内容和类型构建 HttpContent 实例,并将其设置为 HttpRequestMessage 对象的 Content 属性。如下图所示:
IHttpContentProcessor 内容处理器#
IHttpContentProcessor 用于根据用户设置的原始请求内容和类型构建 HttpContent 实例,并将其设置为 HttpRequestMessage 对象的 Content 属性。如下图所示:
内置内容处理器#
StringContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 StringContentProcessor 来构建 StringContent 实例:
- 原始请求内容为
StringContent或JsonContent。 - 内容类型包括
application/json、application/json-patch+json、application/xml、application/xml-patch+xml、text/xml、text/html、text/plain以及application/soap+xml,且即使这些类型后附加有charset字符集(例如application/json; charset=utf-8),依然适用。
StreamContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 StreamContentProcessor 来构建 StreamContent 实例:
- 原始请求内容为
StreamContent或Stream。
ByteArrayContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 ByteArrayContentProcessor 来构建 ByteArrayContent 实例:
- 原始请求内容为
ByteArrayContent或byte[],且不为FormUrlEncodedContent和StringContent。
FormUrlEncodedContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 FormUrlEncodedContentProcessor 来构建 FormUrlEncodedContent 实例:
- 原始请求内容为
FormUrlEncodedContent或URL编码格式的字符串。 - 内容类型为
application/x-www-form-urlencoded,且即使类型后附加有charset字符集(例如application/x-www-form-urlencoded; charset=utf-8),依然适用。
StringContentForFormUrlEncodedContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 StringContentForFormUrlEncodedContentProcessor 来构建内容类型为 application/x-www-form-urlencoded 的 StringContent 实例:
- 原始请求内容为
FormUrlEncodedContent或URL编码格式的字符串。 - 内容类型为
application/x-www-form-urlencoded,且即使类型后附加有charset字符集(例如application/x-www-form-urlencoded; charset=utf-8),依然适用。 useStringContent参数或UseStringContent属性 为true。
StringContentForFormUrlEncodedContentProcessor 派生自 FormUrlEncodedContentProcessor。
ReadOnlyMemoryContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 ReadOnlyMemoryContentProcessor 来构建 ReadOnlyMemoryContent 实例:
- 原始请求内容为
ReadOnlyMemoryContent或ReadOnlyMemory<byte>。
MultipartFormDataContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 MultipartFormDataContentProcessor 来构建 MultipartFormDataContent 实例:
- 原始请求内容为
MultipartFormDataContent。 - 内容类型为
multipart/form-data,且即使类型后附加有charset字符集(例如multipart/form-data; charset=utf-8),依然适用。
MessagePackContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 MessagePackContentProcessor 来构建 ByteArrayContent 实例:
- 内容类型为
application/msgpack,且即使类型后附加有charset字符集(例如application/msgpack; charset=utf-8),依然适用。
JsonLinesContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 JsonLinesContentProcessor 来构建 StringContent 实例:
-
内容类型包括
application/x-ndjson、application/x-jsonlines、application/jsonlines以及application/jsonl,且即使类型后附加有charset字符集(例如application/x-ndjson; charset=utf-8),依然适用。 -
FileInfoContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 FileInfoContentProcessor 来构建 StreamContent 实例:
- 原始请求内容为
FileInfo。
FormFileContentProcessor内容处理器
当原始请求内容满足以下条件时,将使用 FormFileContentProcessor 来构建 StreamContent 实例:
- 原始请求内容为
IFormFile。
IHttpContentProcessorFactory 内容处理器工厂#
IHttpContentProcessorFactory 内容处理器工厂负责根据原始请求的内容和类型,确定合适的 IHttpContentProcessor 内容处理器,并调用其 Process 方法来生成 HttpContent 实例。该工厂服务被配置为单例模式,以确保其在应用程序生命周期中的唯一性和稳定性。
如果未找到合适的 IHttpContentProcessor 内容处理器,将引发 InvalidOperationException 异常,异常信息如下:
No processor found that can handle the content type `application/pdf` and the provided raw content of type `System.Span`1[T]`. Please ensure that the correct content type is specified and that a suitable processor is registered.以下是使用 IHttpContentProcessorFactory 内容处理器工厂与 HttpClient 结合的示例,展示了如何通过其 Build 方法轻松构建合适的 HttpContent 内容。根据之前的章节说明,当内容类型为 application/json 时,将使用 StringContentProcessor 处理器,并生成 StringContent 实例。
public class YourService(IHttpContentProcessorFactory httpContentProcessorFactory) // .NET8+ 支持主构造函数注入{ public async Task<string> GetStringAsync() { var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "https://furion.net/"); // 调用 Build 方法构建 HttpContent 实例,实例具体类型为 StringContent var httpContent = httpContentProcessorFactory.Build(new HttpContentProcessorContext(new { id = 1, name = "Furion" }, "application/json")); httpRequestMessage.Content = httpContent; using var httpClient = new HttpClient(); var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage); return await httpResponseMessage.Content.ReadAsStringAsync(); }}