You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor WebAssembly调用API时如何修改响应Content-Type为application/x-msgpack

如何修改API响应的Content-Type为application/x-msgpack?

我正在使用MessagePack反序列化通过API获取的List<FooViewModel>列表,代码如下:

private async Task FooPageChangeHandler(int newPage)
{
    AllData = await Http.GetFromMessagePackAsync<List<FooViewModel>>($"api/FooView/GetAll/{CurrentPage}/{PageSize}");
}

页面导航后控制台抛出错误:

blazor.webassembly.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
Unhandled exception rendering component: No MediaTypeFormatter is available to read an object of type 'List`1' from content with media type 'text/plain'.

查看响应头发现Content-Type为:

content-type: text/plain; charset=utf-8

我想知道如何将响应的Content-Type修改为application/x-msgpack。我尝试过手动添加请求头,代码如下:

public static async Task<T> GetFromMessagePackAsync<T>(this HttpClient client, Uri requestUri)
{
    if (client == null)
        throw new ArgumentNullException(nameof(client));

    using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
    {
        request.Headers.Add("Accept", "application/x-msgpack");
        request.Headers.TryAddWithoutValidation("Content-Type", "application/x-msgpack");

        var response = await client.SendAsync(request).ConfigureAwait(false);
        return await response.Content.ReadAsMessagePackAsync<T>().ConfigureAwait(false);
    }
}

解决方法

问题核心是服务端没有配置返回application/x-msgpack类型的响应,客户端添加请求头只是声明接受该类型,需要服务端配合输出正确的响应头。

  1. 配置服务端的MessagePack格式化器
    在ASP.NET Core WebAPI的Program.cs中注册MessagePack输出格式化器,指定响应的Content-Type:
builder.Services.AddControllers()
    .AddMessagePackOptions(options =>
    {
        // 可选:移除默认JSON格式化器,只返回MessagePack格式
        options.OutputFormatters.RemoveType<SystemTextJsonOutputFormatter>();
        // 添加MessagePack输出格式化器,使用无契约解析器
        options.OutputFormatters.Add(new MessagePackOutputFormatter(ContractlessStandardResolver.Options));
        // 注册支持的媒体类型
        options.SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/x-msgpack"));
    });
  1. 优化客户端请求代码
    GET请求不需要设置Content-Type头(GET没有请求体),可以删除多余代码,同时建议添加请求成功校验:
public static async Task<T> GetFromMessagePackAsync<T>(this HttpClient client, Uri requestUri)
{
    if (client == null)
        throw new ArgumentNullException(nameof(client));

    using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
    {
        request.Headers.Add("Accept", "application/x-msgpack");

        var response = await client.SendAsync(request).ConfigureAwait(false);
        response.EnsureSuccessStatusCode(); // 确保请求未返回错误状态码
        return await response.Content.ReadAsMessagePackAsync<T>().ConfigureAwait(false);
    }
}
  1. 排查服务端其他配置
  • 检查API的Action是否标注了[Produces("text/plain")]之类的特性,如有需移除;
  • 确认没有中间件强制修改响应的Content-Type;
  • 测试服务端接口,用Postman等工具查看响应头是否为application/x-msgpack。

内容的提问来源于stack exchange,提问作者RandomUsername

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:07:40