接受.net核心webapi控制器中的byte []

时间:2018-06-18 21:56:08

标签: c# asp.net-core asp.net-core-webapi

如何接受.net核心中的WebAPI控制器中的byte []。如下所示:

    [HttpPost]
    public IActionResult Post(byte[] rawData)
    {
        try
        {
            System.Diagnostics.Trace.WriteLine("Total bytes posted: " + rawData?.Length);
            return StatusCode(200);
        }
        catch(Exception ex)
        {
            return StatusCode(500, $"Error. msg: {ex.Message}");
        }
    }

从fiddler测试时,我得到415 Unsupported Media Type错误。 这在.net核心webapi中甚至可能吗?我已经搜索了一段时间,并没有针对.net核心的解决方案。有一些BinaryMediaTypeFormatter的例子不适用于.net核心webapi。如果使用webapi无法实现这一点,那么在.net核心Web应用程序中接受字节数组的最佳解决方案是什么?

我们的旧应用程序是一个asp.net表单应用程序。它将调用Request.BinaryRead()来获取字节数组并处理数据。我们正在将此应用程序迁移到.net核心。

谢谢。

1 个答案:

答案 0 :(得分:6)

最终创建一个InputFormatter以将发布的数据读取为byte []数组。

public class BinaryInputFormatter : InputFormatter
{
    const string binaryContentType = "application/octet-stream";
    const int bufferLength = 16384;

    public BinaryInputFormatter()
    {
        SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse(binaryContentType));
    }

    public async override Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
    {
        using (MemoryStream ms = new MemoryStream(bufferLength))
        {
            await context.HttpContext.Request.Body.CopyToAsync(ms);
            object result = ms.ToArray();
            return await InputFormatterResult.SuccessAsync(result);
        }
    }

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

在Startup class

中配置它
        services.AddMvc(options =>
        {
            options.InputFormatters.Insert(0, new BinaryInputFormatter());
        });

我的WebAPI控制器有以下方法来接收HTTP发布的数据(注意,我的默认路由将Post作为操作而不是索引。)

    [HttpPost]
    public IActionResult Post([FromBody] byte[] rawData)
    {
        try
        {
            System.Diagnostics.Trace.WriteLine("Total bytes posted: " + rawData?.Length);
            return StatusCode(200);
        }
        catch(Exception ex)
        {
            return StatusCode(500, $"Error. msg: {ex.Message}");
        }
    }

对控制器执行HTTP Post后,rawData参数将已发布的数据放在字节数组中。