Подтвердить что ты не робот

MVC или байт передачи API Web [] наиболее эффективный подход

После успешной реализации ajax POST, загрузки объектов модели и даже сложных объектов благодаря этому хороший пост, новая цель - реализовать реализацию еще более сложного сценария.

Я попытался реализовать эту задачу с помощью примеров кода, ищущих google без конкретного и правильного ответа

Цель состоит в том, чтобы обеспечить передачу данных с нескольких целей (с несколькими данными) с клиентской стороны на сервер (без использования формы или HttpRequestBase), передавая исходный массив байтов самым эффективным способом (я знаю, что это возможно для реализации нового протокола HTTP/2 или googles Буферы протокола - формат обмена данными Google

[HttpPost]
public JsonResult UploadFiles(byte[] parUploadBytearry)
{
}

предпочтительно модель, одним из ее свойств которой является byte[]

[HttpPost]
public [JsonResult / ActionResult] Upload(SomeClassWithByteArray parDataModel)
{
}

Ajax http Post Signature:

Log("AajaxNoPostBack preparing post-> " + targetUrl);
$.ajax({
    type: 'POST',
    url: targetUrl,
    data: mods,
    contentType: "application/json; charset=utf-8",
    dataType: "json",

    success:  function for Success..
});

Я также отчаянно пробовал это обходное решение

public JsonResult UploadFiles(object parUploadBytearry)
{
    if (parUploadBytearry== null)
        return null;
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
    var pathtosSave = System.IO.Path.Combine(Server.MapPath("~/Content/uploaded"), "Test11.png");
    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
    {
        bf.Serialize(ms, parUploadFiles);
        var Barr =  ms.ToArray();
        var s = new System.Web.Utils.FileFromBar(pathtosSave, BR);
    }
}

так как он опубликовал и получил данные до момента сохранения данных (.png) до файла в системе, данные не были законными.

И последняя разумная попытка перед попыткой массива байта объекта была в этом msdn Пример кода 1

Каков правильный способ передать байтовый массив, который будет понимать С#?

(в случае документов raw byte[] или файлов типа png изображений)

4b9b3361

Ответ 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);
    }
}