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

在成功实现了ajaxpost之后,由于这篇漂亮的文章,上传了模型对象甚至复杂对象,
新的目标是实现更复杂的场景

我试图通过搜索google的代码示例来实现这个问题,但没有一个具体和正确的答案

目标是让多用途(多数据类型)数据从客户端传输到服务器(无需使用表单或HttpRequestBase),以最有效的方式传递原始字节数组(我知道可以实现新协议HTTP/2或谷歌)
协议缓冲区-谷歌的数据交换格式

[HttpPost]
公共JsonResult上载文件(字节[]parUploadBytearry)
{
}

最好是一个模型,其属性之一是字节[]

[HttpPost]
公共[JsonResult/ActionResult]上传(SomeClassWithByteArray parDataModel)
{
}

ajax http Post签名:

日志(“AajaxNoPostBack准备post->”+targetUrl);
$.ajax({
键入:“POST”,
url:targetUrl,
数据:mods,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:成功的功用。。
});

我也不顾一切地尝试了这种变通方法

公共JsonResult上载文件(对象parUploadBytearry)
{
if(parUploadBytearry==null)
返回null;
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf=new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
var pathtosave=System.IO.Path.Combine(Server.MapPath(“~/Content/upload”),“Test11.png”);
使用(System.IO.MemoryStream ms=new System.IO.MemoryStream())
{
序列化(ms,预上传文件);
var Barr=ToArray女士();
var s=new System.Web.Utils.FileFromBar(pathtosave,BR);
}
}

由于它在将数据(.png)成功保存到系统中的文件的过程中一直发布和接收数据,因此数据不合法

在对象到字节数组尝试之前的最后一次sane尝试是msdn代码示例1

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

(对于文档raw byte[]或类似于png图像的文件)

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

从WebAPI中读取字节[]而无需为“应用程序/八位字节流”编写自定义MediaTypeFormatter的最简单方法是从请求流手动读取:

[HttpPost]
公共异步任务<JsonResult>上载文件()
{
byte[]bytes=wait Request.Content.ReadAsByteArrayAsync();
}

在另一篇文章中,我描述了如何利用WebAPI 2.1中存在的BSON(二进制JSON)内置格式化程序

如果您确实想读写一个回答“应用程序/八位字节流”的BinaryMediaTypeFormatter,一个简单的实现如下所示:

公共类二进制MediaTypeFormatter:MediaTypeFormatter
{
私有静态只读类型supportedType=typeof(字节[]);
公共二进制MediaTypeFormatter()
{
添加(新的MediaTypeHeaderValue(“应用程序/八位字节流”);
}
公共覆盖布尔CanReadType(类型)
{
返回类型==supportedType;
}
公共重写bool CanWriteType(类型)
{
返回类型==supportedType;
}
公共重写异步任务<对象>ReadFromStreamAsync(类型、流、,
HttpContent,IFormatterLogger格式记录器)
{
使用(var memoryStream=new memoryStream())
{
等待流.CopyToAsync(memoryStream);
返回memoryStream.ToArray();
}
}
公共重写任务WriteToStreamAsync(类型、对象值、流、,
HttpContent内容,TransportContext(TransportContext)
{
如果(值==null)
抛出新的ArgumentNullException(“值”);
如果(!type.IsSerializable)
抛出新的序列化异常(
$“类型{Type}未标记为可序列化”);
var binaryFormatter=新的binaryFormatter();
序列化(流,值);
返回Task.FromResult(true);
}
}

发表评论