如何接受.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核心。
谢谢。
答案 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参数将已发布的数据放在字节数组中。