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

如何向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:40:27