Введение:
Веб-приложение ASP.NET MVC 3, действие контроллера, которое принимает экземпляр класса модели POCO с (потенциально) большим полем.
Модельный класс:
public class View
{
[Required]
[RegularExpression(...)]
public object name { get; set; }
public object details { get; set; }
public object content { get; set; } // the problem field
}
Действие контроллера:
[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
}
Проблема:
Действие должно иметь возможность принимать большие объекты JSON (по крайней мере, до ста мегабайт в одном запросе и без шуток). По умолчанию я встречался с несколькими ограничениями, такими как httpRuntime maxRequestLength
и т.д. - все решалось кроме MaxJsonLengh - это означает, что значение ValueProviderFactory по умолчанию для JSON не способно обрабатывать такие объекты.
Пробовал:
Настройка
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483647"/>
</webServices>
</scripting>
</system.web.extensions>
- не помогает.
Создание собственного пользовательского ValueProviderFactory, как описано в @Darin, здесь:
JsonValueProviderFactory выдает запрос слишком большой "
- также не удалось, потому что у меня нет возможности использовать JSON.Net(по нетехническим причинам). Я попытался реализовать правильную десериализацию здесь сам, но, по-видимому, это немного выше моих знаний (пока). Мне удалось десериализовать мою строку JSON в
Dictionary<String,Object>
здесь, но это не то, что я хочу - я хочу десериализовать ее на мои прекрасные объекты POCO и использовать их в качестве входных параметров для действий.
Итак, вопросы:
- Кто-нибудь знает лучший способ преодолеть проблему без реализации универсального настраиваемого ValueProviderFactory?
- Есть ли возможность указать, для какого конкретного контроллера и действия я хочу использовать свой собственный ValueProviderFactory? Если я знаю действие заранее, я смогу десериализовать JSON в POCO без большой кодировки в ValueProviderFactory...
- Я также думаю о реализации пользовательского ActionFilter для этой конкретной проблемы, но я думаю, что это немного уродливо.
Кто-нибудь может предложить хорошее решение?