如何向Azure Web API POST端点正确发送图片二进制数据?
解决HTTP 415错误并实现图片收发
一、API端点修正
你的API端点使用[FromBody] byte[] content时,ASP.NET Core默认的输入格式化器仅处理JSON格式,无法直接解析application/octet-stream类型的二进制数据,这是导致415错误的核心原因。以下两种简单方案可以解决:
方式1:改用Stream参数(推荐,更高效)
直接接收流类型,无需额外配置格式化器:
public async Task<ActionResult<string>> AddUserImage( [FromRoute] string userId, [FromHeader] bool doNotOverwrite, Stream content, CancellationToken ct) { // 按需将Stream转为byte[] using var ms = new MemoryStream(); await content.CopyToAsync(ms, ct); var imgBytes = ms.ToArray(); // 后续图片处理逻辑... return Ok("图片上传成功"); }
方式2:添加byte[]专用输入格式化器
如果坚持使用byte[]作为参数,需要在Program.cs中配置支持application/octet-stream的输入格式化器:
builder.Services.AddControllers(options => { options.InputFormatters.Insert(0, new ByteArrayInputFormatter()); }); // 自定义格式化器实现 public class ByteArrayInputFormatter : InputFormatter { public ByteArrayInputFormatter() { SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/octet-stream")); } protected override bool CanReadType(Type type) { return type == typeof(byte[]); } public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context) { using var ms = new MemoryStream(); await context.HttpContext.Request.Body.CopyToAsync(ms); return await InputFormatterResult.SuccessAsync(ms.ToArray()); } }
二、客户端请求修正
客户端之前错误使用JsonContent.Create(会把byte[]序列化为JSON数组,而非原始二进制流),且频繁新建HttpClient是不良实践。修正后的代码如下:
// 建议将HttpClient作为单例复用,避免频繁创建实例 private static readonly HttpClient _httpClient = new HttpClient(); public async Task<bool> AddOrReplaceImage(string id, string endpoint, byte[] imgBinary) { if (imgBinary is null) throw new ArgumentNullException(nameof(imgBinary)); var request = new HttpRequestMessage(HttpMethod.Post, endpoint); // 布尔类型Header直接传字符串"false"/"true",ASP.NET Core会自动解析 request.Headers.Add("doNotOverwrite", "false"); // 使用ByteArrayContent直接发送二进制数据 request.Content = new ByteArrayContent(imgBinary); // 必须设置正确的Content-Type request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); var apiResult = await _httpClient.SendAsync(request); return apiResult.IsSuccessStatusCode; }
额外注意事项
- 确保请求的
endpoint包含正确的userId路由参数,示例格式:https://your-api-domain/users/{userId}/image - 若需上传大图片,需在API端配置请求大小限制:
builder.Services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 10 * 1024 * 1024; // 设置为10MB,可按需调整 });
内容的提问来源于stack exchange,提问作者Silas
相关产品推荐
相关产品推荐

