6.2自定义内容处理器
在特定场景下,当框架内置的 IHttpContentProcessor 内容处理器无法满足需求时,可以通过自定义 IHttpContentProcessor 内容处理器来解决。
自定义内容处理器(如序列化)#
在特定场景下,当框架内置的 IHttpContentProcessor 内容处理器无法满足需求时,可以通过自定义 IHttpContentProcessor 内容处理器来解决。
如果您希望替换框架默认的 System.Text.Json 序列化提供程序,例如使用 Newtonsoft.Json 来为 application/json 内容类型添加特定的序列化配置选项,那么您可以通过实现 IHttpContentProcessor 接口来满足这一自定义需求。
public class CustomStringContentProcessor : HttpContentProcessorBase{ public override bool CanProcess(HttpContentProcessorContext context) => context.ContentType == "application/json"; public override HttpContent? Process(HttpContentProcessorContext context) { if (TryProcess(context, out var httpContent)) { return httpContent; } var content = context.RawContent!.GetType().IsBasicType() || context.RawContent is JsonElement or JsonNode ? context.RawContent.ToString() : context.RawContent.ToJsonString(ResolveJsonSerializerOptions(context.HttpClientName)); var stringContent = new StringContent(content!, context.Encoding, new MediaTypeHeaderValue(context.ContentType) { CharSet = context.Encoding?.WebName ?? "utf-8" }); return stringContent; }}接下来,可以通过以下两种方式应用自定义内容处理器:
- 单次请求设置:
HttpRequestBuilder.Post("https://furion.net/") .AddHttpContentProcessors(() => [ new CustomStringContentProcessor() ]) .SetJsonContent(new { id = 1, name = "Furion" });- 全局配置:
在 Startup.cs 或 Program.cs 文件中,配置并注册 HttpRemote 服务,以启用自定义内容处理器功能:
services.AddHttpRemote(builder =>{ builder.AddHttpContentProcessors(() => [ new CustomStringContentProcessor() ]);});添加 MessagePack 支持#
MessagePack 是一种紧凑、高效的二进制序列化格式,专为多种语言间的数据交换设计。相较于 JSON,MessagePack 提供了更高的性能和更小的数据体积。尽管是二进制格式,MessagePack 在设计时便充分考虑了跨语言使用的便捷性,目前已被广泛应用于 Python、Ruby、JavaScript、C++ 以及 C# 等多种编程语言中。
要在项目中启用 MessagePack 支持,请按照以下步骤操作:
- 安装
MessagePack包:
dotnet add package MessagePack- 添加
MessagePackContentProcessor内容处理器:
public class MessagePackContentProcessor : HttpContentProcessorBase{ /// <inheritdoc /> public override bool CanProcess(HttpContentProcessorContext context) => context.ContentType == "application/msgpack"; /// <inheritdoc /> public override HttpContent? Process(HttpContentProcessorContext context) { // 尝试解析 HttpContent 类型 if (TryProcess(context, out var httpContent)) { return httpContent; } // 将原始请求内容转换为字节数组 var content = context.RawContent as byte[] ?? MessagePackSerializer.Serialize(context.RawContent); // 初始化 ByteArrayContent 实例 var byteArrayContent = new ByteArrayContent(content); byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue(context.ContentType) { CharSet = context.Encoding?.WebName }; return byteArrayContent; }}- 应用
MessagePackContentProcessor内容处理器:
- 单次请求设置:
HttpRequestBuilder.Post("https://furion.net/") .AddHttpContentProcessors(() => [ new MessagePackContentProcessor() ]) .SetContent(new MessagePackModel { Id = 1, Name = "Furion" }, "application/msgpack");- 全局配置:
在 Startup.cs 或 Program.cs 文件中,配置并注册 HttpRemote 服务,以启用 MessagePackContentProcessor 内容处理器功能:
services.AddHttpRemote(builder =>{ builder.AddHttpContentProcessors(() => [ new MessagePackContentProcessor() ]);});这样可以在项目中通过 HTTP 远程请求发送 application/msgpack 格式的数据。
添加 Protobuf 支持#
Protobuf(Protocol Buffers)是 Google 开发的一种语言中立、平台中立、可扩展的序列化结构数据格式,用于通信协议、数据存储等。
要在项目中启用 Protobuf 支持,请按照以下步骤操作:
- 安装
protobuf-net包:
dotnet add protobuf-net- 添加
ProtobufContentProcessor内容处理器:
public class ProtobufContentProcessor : HttpContentProcessorBase{ /// <inheritdoc /> public override bool CanProcess(HttpContentProcessorContext context) => context.ContentType == "application/x-protobuf"; /// <inheritdoc /> public override HttpContent? Process(HttpContentProcessorContext context) { // 尝试解析 HttpContent 类型 if (TryProcess(context, out var httpContent)) { return httpContent; } byte[] content; if (context.RawContent is byte[] bytes) { content = bytes; } else { // 将原始请求内容转换为字节数组 using var ms = new MemoryStream(); Serializer.Serialize(ms, context.RawContent); content = ms.ToArray(); } // 初始化 ByteArrayContent 实例 var byteArrayContent = new ByteArrayContent(content); byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue(context.ContentType) { CharSet = context.Encoding?.WebName }; return byteArrayContent; }}- 应用
ProtobufContentProcessor内容处理器:
- 单次请求设置:
HttpRequestBuilder.Post("https://furion.net/") .AddHttpContentProcessors(() => [ new ProtobufContentProcessor() ]) .SetContent(new MyProtobufMessage { Id = 1, Name = "Furion" }, "application/x-protobuf");- 全局配置:
在 Startup.cs 或 Program.cs 文件中,配置并注册 HttpRemote 服务,以启用 ProtobufContentProcessor 内容处理器功能:
services.AddHttpRemote(builder =>{ builder.AddHttpContentProcessors(() => [ new ProtobufContentProcessor() ]);});这样可以在项目中通过 HTTP 远程请求发送 application/x-protobuf 格式的数据。