2016-03-13 21 views
13

Sau khi thực hiện thành công ajax POST, tải lên các đối tượng mô hình và thậm chí các đối tượng phức tạp nhờ vào mục tiêu mới này là phải thực hiện một kịch bản phức tạp hơn một chút. Page 46MVC hoặc API truyền Web API [] cách tiếp cận hiệu quả nhất

Tôi đã cố gắng để thực hiện các nhiệm vụ trong câu hỏi thông qua các ví dụ mã tìm kiếm google mà không có một bê tông và câu trả lời đúng

Mục đích là để có mục đích đa (đa dữ liệu-type) truyền dữ liệu từ phía khách hàng đến máy chủ (không có sử dụng một hình thức hoặc HttpRequestBase) đi qua mảng byte thô theo cách hiệu quả nhất (tôi biết rằng nó có thể thực hiện một giao thức mới HTTP/2 hoặc Googles Protocol Buffers - Google's data interchange format

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

tốt một mô hình mà một trong những thuộc tính của nó là một byte[]

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

Các ajax http bài viết Chữ ký:

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

    success: function for Success.. 
}); 

Tôi cũng hết sức cố gắng workaround này

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

như nó đã làm bài và nhận dữ liệu tất cả các cách để lưu dữ liệu (.png) thành công vào một tệp trong hệ thống, dữ liệu không hợp lệ.

Và thử lành mạnh cuối cùng trước khi đối tượng để cố gắng mảng byte là MSDN này Code example 1

cách chính xác để vượt qua một mảng byte mà C# sẽ hiểu là gì?

(trong trường hợp các văn bản raw byte[] hoặc các tập tin như png hình ảnh)

+0

trong 'SomeClassWithByteArray' ví dụ của bạn, nếu chuyển giao thức là JSON, làm thế nào để bạn serialize mảng byte? Base64? –

+0

đây cũng là một tùy chọn, như tôi đã nói ở đầu bài đăng cho các đối tượng phức tạp mà tôi đã sử dụng plugin 'toDictionary', tôi đã mong đợi rằng dữ liệu thô , là một trong những thành viên của nó, sẽ là nhỏ nhất để sau đó chuyển đổi bất kỳ phương pháp hiệu quả nào –

Trả lời

3

cách chính xác để vượt qua một mảng byte

Cách đơn giản nhất của việc đọc một byte[] từ WebAPI mà không viết là gì tùy chỉnh MediaTypeFormatter cho "ứng dụng/octet-stream" là chỉ cần đọc nó từ luồng yêu cầu theo cách thủ công:

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

Trong another post, tôi mô tả cách sử dụng trình định dạng dựng sẵn cho BSON (JSON nhị phân) tồn tại trong WebAPI 2.1.

Nếu bạn muốn đi xuống đọc và viết một BinaryMediaTypeFormatter mà trả lời "application/octet-stream", một thực hiện ngây thơ sẽ trông như thế này:

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

WebAPI 2.1 hoặc Request.Content (cụ thể bây giờ) là nó tương thích với .NET 4.03? trong dự án của tôi, không có 'Request.Content' Definition –

+0

Web API 2.1 nên, không có ràng buộc đối với phiên bản .NET AFAIK. Việc sử dụng 'async-await', với .NET 4.0.3 sẽ yêu cầu bạn sử dụng ['Microsoft.Async.Bcl'] (https://www.nuget.org/packages/Microsoft.Bcl.Async/) thư viện. –

+0

_This gói không được hỗ trợ trong Visual Studio 2010, _ tôi biết tôi sẽ cần phải đóng gói và di chuyển một ngày, nhưng không phải bây giờ .. tôi vẫn còn mắc kẹt với 2010 quen thuộc như trong ứng dụng máy tính để bàn tôi đã không đạt đến đỉnh cao công nghệ phát triển của Microsoft, tôi có thể thấy trong web dev câu chuyện là khác nhau. nếu bạn không sử dụng mới nhất ... tất cả mọi thứ. bạn chỉ đơn giản là không thể làm việc (không phải ở tất cả nhưng tối ưu) –

Các vấn đề liên quan