6.1内容处理器(内置)

IHttpContentProcessor 用于根据用户设置的原始请求内容和类型构建 HttpContent 实例,并将其设置为 HttpRequestMessage 对象的 Content 属性。如下图所示:

IHttpContentProcessor 内容处理器#

IHttpContentProcessor 用于根据用户设置的原始请求内容和类型构建 HttpContent 实例,并将其设置为 HttpRequestMessage 对象的 Content 属性。如下图所示:

查看高清架构图

内置内容处理器#

  • StringContentProcessor 内容处理器

当原始请求内容满足以下条件时,将使用 StringContentProcessor 来构建 StringContent 实例:

  • 原始请求内容为 StringContentJsonContent
  • 内容类型包括 application/jsonapplication/json-patch+jsonapplication/xmlapplication/xml-patch+xmltext/xmltext/htmltext/plain 以及 application/soap+xml,且即使这些类型后附加有 charset 字符集(例如 application/json; charset=utf-8),依然适用。

  • StreamContentProcessor 内容处理器

当原始请求内容满足以下条件时,将使用 StreamContentProcessor 来构建 StreamContent 实例:

  • 原始请求内容为 StreamContentStream

  • ByteArrayContentProcessor 内容处理器

当原始请求内容满足以下条件时,将使用 ByteArrayContentProcessor 来构建 ByteArrayContent 实例:

  • 原始请求内容为 ByteArrayContentbyte[],且不为 FormUrlEncodedContentStringContent

  • FormUrlEncodedContentProcessor 内容处理器

当原始请求内容满足以下条件时,将使用 FormUrlEncodedContentProcessor 来构建 FormUrlEncodedContent 实例:

  • 原始请求内容为 FormUrlEncodedContentURL 编码格式的字符串。
  • 内容类型为 application/x-www-form-urlencoded,且即使类型后附加有 charset 字符集(例如 application/x-www-form-urlencoded; charset=utf-8),依然适用。

  • StringContentForFormUrlEncodedContentProcessor 内容处理器

当原始请求内容满足以下条件时,将使用 StringContentForFormUrlEncodedContentProcessor 来构建内容类型为 application/x-www-form-urlencodedStringContent 实例:

  • 原始请求内容为 FormUrlEncodedContentURL 编码格式的字符串。
  • 内容类型为 application/x-www-form-urlencoded,且即使类型后附加有 charset 字符集(例如 application/x-www-form-urlencoded; charset=utf-8),依然适用。
  • useStringContent 参数或 UseStringContent 属性 为 true

StringContentForFormUrlEncodedContentProcessor 派生自 FormUrlEncodedContentProcessor


  • ReadOnlyMemoryContentProcessor 内容处理器

当原始请求内容满足以下条件时,将使用 ReadOnlyMemoryContentProcessor 来构建 ReadOnlyMemoryContent 实例:

  • 原始请求内容为 ReadOnlyMemoryContentReadOnlyMemory<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-ndjsonapplication/x-jsonlinesapplication/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 异常,异常信息如下:

bash
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 实例。

cs
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();    }}