Intro:
Web application, ASP.NET MVC 3, a controller action that accepts an instance of POCO model class with (potentially) large field.
Model class:
public class View
{
[Required]
[RegularExpression(...)]
public object name { get; set; }
public object details { get; set; }
public object content { get; set; } // the problem field
}
Controller action:
[ActionName(...)]
[Authorize(...)]
[HttpPost]
public ActionResult CreateView(View view)
{
if (!ModelState.IsValid) { return /*some ActionResult here*/;}
... //do other stuff, create object in db etc. return valid result
}
Problem:
An action should be able to accept large JSON objects (at least up to hundred megabytes in a single request and that’s no joke). By default I met with several restrictions like httpRuntime maxRequestLength etc. – all solved except MaxJsonLengh – meaning that default ValueProviderFactory for JSON is not capable of handling such objects.
Tried:
Setting
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483647"/>
</webServices>
</scripting>
</system.web.extensions>
- does not help.
Creating my own custom ValueProviderFactory as described in @Darin’s answer here:
JsonValueProviderFactory throws "request too large"
- also failed because I have no possibility to use JSON.Net (due to non-technical reasons). I tried to implement correct deserialization here myself but apparently it’s a bit above my knowledge (yet). I was able to deserialize my JSON string to
Dictionary<String,Object>here, but that’s not what I want – I want to deserialize it to my lovely POCO objects and use them as input parameters for actions.
So, the questions:
- Anyone knows better way to overcome the problem without implementing universal custom ValueProviderFactory?
- Is there a possibility to specify for what specific controller and action I want to use my custom ValueProviderFactory? If I know the action beforehand than I will be able to deserialize JSON to POCO without much coding in ValueProviderFactory…
- I’m also thinking about implementing a custom ActionFilter for that specific problem, but I think it’s a bit ugly.
Anyone can suggest a good solution?
The built-in JsonValueProviderFactory ignores the
<jsonSerialization maxJsonLength="50000000"/>setting. So you could write a custom factory by using the built-in implementation:The only modification I did compared to the default factory is adding the following line:
Unfortunately this factory is not extensible at all, sealed stuff so I had to recreate it.
and in your
Application_Start: