Ответ 1
Каков правильный способ передачи байтового массива
Самый простой способ чтения byte[]
из WebAPI без написания специального MediaTypeFormatter для "application/octet-stream" - это просто прочитать его из потока запросов вручную:
[HttpPost]
public async Task<JsonResult> UploadFiles()
{
byte[] bytes = await Request.Content.ReadAsByteArrayAsync();
}
В другом сообщении я описал, как использовать встроенный форматировщик для BSON (двоичный JSON), который существует в WebAPI 2.1.
Если вы хотите спуститься вниз, прочитайте и напишите BinaryMediaTypeFormatter
, который отвечает "application/octet-stream", наивная реализация будет выглядеть так:
public class BinaryMediaTypeFormatter : MediaTypeFormatter
{
private static readonly Type supportedType = typeof(byte[]);
public BinaryMediaTypeFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));
}
public override bool CanReadType(Type type)
{
return type == supportedType;
}
public override bool CanWriteType(Type type)
{
return type == supportedType;
}
public override async Task<object> ReadFromStreamAsync(Type type, Stream stream,
HttpContent content, IFormatterLogger formatterLogger)
{
using (var memoryStream = new MemoryStream())
{
await stream.CopyToAsync(memoryStream);
return memoryStream.ToArray();
}
}
public override Task WriteToStreamAsync(Type type, object value, Stream stream,
HttpContent content, TransportContext transportContext)
{
if (value == null)
throw new ArgumentNullException("value");
if (!type.IsSerializable)
throw new SerializationException(
$"Type {type} is not marked as serializable");
var binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(stream, value);
return Task.FromResult(true);
}
}