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类型的响应,客户端添加请求头只是声明接受该类型,需要服务端配合输出正确的响应头。
- 配置服务端的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")); });
- 优化客户端请求代码
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); } }
- 排查服务端其他配置
- 检查API的Action是否标注了
[Produces("text/plain")]之类的特性,如有需移除; - 确认没有中间件强制修改响应的Content-Type;
- 测试服务端接口,用Postman等工具查看响应头是否为
application/x-msgpack。
内容的提问来源于stack exchange,提问作者RandomUsername
相关产品推荐
相关产品推荐

