5

Điều này liên quan đến điều này question, nhưng trong trường hợp này nó không phải là một cái gì đó tôi đang trở về mà là mô hình ràng buộc. Tôi đang sử dụng Postmark để xử lý các email đến, bài đăng đến một trang có số JSON payload.Làm cách nào để xử lý đầu vào JSON lớn từ Dấu bưu điện trong ứng dụng MVC của tôi?

Tôi có một mô hình như dưới đây và một hành động thực hiện trong tải trọng JSON này (được đăng với ứng dụng/json) và xử lý nó.

Điều này làm việc tốt cho các tệp đính kèm nhỏ, nhưng đối với bất kỳ thứ gì vượt quá thuộc tính maxJsonLength gây ra lỗi trong quá trình deserialization. ("Lỗi trong quá trình tuần tự hóa hoặc deserialization bằng cách sử dụng JSON JavaScriptSerializer. Độ dài của chuỗi vượt quá giá trị được đặt trên thuộc tính maxJsonLength.") Vì tôi muốn chấp nhận tệp đính kèm hình ảnh, điều này có nghĩa là hầu hết các hình ảnh đều không thành công.

Tôi đã thử cập nhật web.config, nhưng theo các chủ đề khác, điều này không giúp ích cho bộ điều khiển MVC. Tôi hình tôi có lẽ có thể làm những gì đã được đề cập trong một IModelBinder tùy chỉnh, nhưng tôi đang đấu tranh với làm thế nào để đánh chặn deserialization. (Nói cách khác, nó vẫn thất bại vì việc deserialization đã xảy ra rồi).

Mọi đề xuất? Tôi chắc chắn rằng nó chỉ là một cái gì đó ngu ngốc mà tôi đang thiếu ....

Trả lời

3

Bạn có thể viết một custom JsonValueProviderFactory sử dụng Json.NET:

public sealed class JsonDotNetValueProviderFactory : ValueProviderFactory 
{ 
    public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
    { 
     if (controllerContext == null) 
      throw new ArgumentNullException("controllerContext"); 

     if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) 
      return null; 

     var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream); 
     var bodyText = reader.ReadToEnd(); 

     return String.IsNullOrEmpty(bodyText) ? null : new DictionaryValueProvider<object>(JsonConvert.DeserializeObject<ExpandoObject>(bodyText, new ExpandoObjectConverter()) , CultureInfo.CurrentCulture); 
    } 
} 

và bạn Application_Start:

ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault()); 
ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory()); 
+0

Cảm ơn Darin - trông giống như một cách tiếp cận tốt. Tôi sẽ chụp ảnh đó vào ngày mai. –

+0

@Darin Có cách nào để thêm điều này chỉ vào một bộ điều khiển cụ thể thay vì toàn bộ ứng dụng không? –

+0

Xin chào Darin, bạn có nhớ xem [câu hỏi của tôi] (http://stackoverflow.com/q/32970848/7850) để xem tại sao điều này không hiệu quả với tôi không? Cảm ơn! –

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