.NET Core HttpClient 上传字节数组给出不受支持的媒体类型错误

Ton*_*ony 7 c# asp.net-core

我正在尝试为我的 Web Api 控制器(ASP.NET Core 3)上传一个简单的字节数组

using var client = new HttpClient() { BaseAddress = new Uri("http://someUrl.com/") };
var body = new ByteArrayContent(new byte[] {1, 2, 3});

var result = await client.PostAsync("api/somecontroller/content?someField=someData", body);
Run Code Online (Sandbox Code Playgroud)

控制器

[HttpPost("content")]
public IActionResult Upload([FromBody]byte[] documentData, [FromQuery] string someField)
{
    ...

    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

但这给了我错误415 Unsupported media type。为什么 ?我需要在 url 中添加一些额外的数据,但我认为这不是问题所在。

Ren*_*ena 10

虽然byte[]这是表示application/octet-stream数据的好方法,但在 asp.net 核心 Web API 中默认情况并非如此。

这是一个简单的解决方法:

通过 HttpClient 发送请求:

using var client = new HttpClient() { BaseAddress = new Uri("http://localhost:62033") };
var body = new ByteArrayContent(new byte[] { 1, 2, 3 });
body.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");           
var result = await client.PostAsync("api/Values/content?someField=someData", body);
Run Code Online (Sandbox Code Playgroud)

在 Web Api 项目中接收操作:

[HttpPost("content")]
public IActionResult Upload([FromBody]byte[] documentData, [FromQuery] string someField)
{
        return Ok();
}
Run Code Online (Sandbox Code Playgroud)

Web Api 项目中的自定义 InputFormatter:

public class ByteArrayInputFormatter : InputFormatter
{
    public ByteArrayInputFormatter()
    {
        SupportedMediaTypes.Add(Microsoft.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/octet-stream"));
    }

    protected override bool CanReadType(Type type)
    {
        return type == typeof(byte[]);
    }

    public override Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
    {
        var stream = new MemoryStream();
        await context.HttpContext.Request.Body.CopyToAsync(stream);
        return InputFormatterResult.SuccessAsync(stream.ToArray());
    }
}
Run Code Online (Sandbox Code Playgroud)

Web Api 项目中的 Startup.cs:

services.AddControllers(options=> 
        options.InputFormatters.Add(new ByteArrayInputFormatter()));
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

  • 您可以异步/等待 ReadRequestBodyAsync 方法吗?我想到了我的代码中的一些问题,因此浪费了 20 分钟。 (2认同)