MVC或Web API传输byte []是最有效的方法

时间:2016-03-13 08:00:51

标签: c# ajax asp.net-mvc asp.net-mvc-4 bytearray

成功实施ajax POST后,通过此nice post上传模型对象甚至复杂对象, 新的目标是实现更复杂的情况。

我试图通过搜索谷歌的代码示例来实现相关任务,但没有具体和正确的答案

目标是从客户端到服务器进行多用途(多数据类型)数据传输(不使用表单或HttpRequestBase)以最有效的方式传递原始字节数组(我知道它可以实现新的协议HTTP/2或谷歌 Protocol Buffers - Google's data interchange format

[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 Code example 1

传递C#理解的字节数组的正确方法是什么?

(如果是文档raw byte[]或文件,例如png图片)

1 个答案:

答案 0 :(得分:3)

  

传递字节数组的正确方法是什么

从WebAPI读取byte[]而不为“application / octet-stream”编写自定义MediaTypeFormatter的最简单方法是手动从请求流中读取它:

[HttpPost]
public async Task<JsonResult> UploadFiles()
{
    byte[] bytes = await Request.Content.ReadAsByteArrayAsync();
}

another post中,我描述了如何利用WebAPI 2.1中存在的BSON(Binary JSON)的内置格式化程序。

如果您确实想要阅读并写下一个回复“application / octet-stream”的BinaryMediaTypeFormatter,那么天真的实现将如下所示:

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);
    }
}