Как я могу обработать большой ввод JSON из Postmark в моем приложении MVC? - PullRequest
5 голосов
/ 06 марта 2012

Это относится к этому вопросу , но в данном случае это не то, что я возвращаю, а скорее привязка модели. Я использую Почтовый штемпель для обработки входящих электронных писем, которые публикуют на странице с JSON полезной нагрузкой .

У меня есть модель, как показано ниже, и действие, которое принимает эту полезную нагрузку JSON (опубликовано с application / json) и обрабатывает ее.

public class EmailModel
{
    public IDictionary<string, string> Headers { get; set; }
    public string From { get; set; }
    public string Cc { get; set; }
    public string HtmlBody { get; set; }
    public string TextBody { get; set; }
    public string ReplyTo { get; set; }
    public string Tag { get; set; }
    public string To { get; set; }
    public string MessageID { get; set; }
    public string MailboxHash { get; set; }
    public string Subject { get; set; }
    public List<Attachment> Attachments { get; set; }
}

public class Attachment
{
    public string Content { get; set; }
    public int ContentLength { get; set; }
    public string ContentType { get; set; }
    public string Name { get; set; }

}

Это прекрасно работает для небольших вложений, но для всего, что превышает свойство maxJsonLength по умолчанию, вызывает ошибку при десериализации. («Ошибка во время сериализации или десериализации с использованием JSON JavaScriptSerializer. Длина строки превышает значение, установленное в свойстве maxJsonLength.») Поскольку я хочу принимать вложения изображений, это означает, что большинство изображений не работают.

Я попытался обновить web.config, но, как и в случае с другими потоками, это не помогает для контроллеров MVC. Я полагаю, что могу, вероятно, сделать то, что было упомянуто в пользовательском IModelBinder, но я борюсь с тем, как перехватить десериализацию. (Другими словами, это все еще терпит неудачу, потому что десериализация уже произошла).

Есть предложения? Я уверен, что это просто что-то глупое, что я скучаю ....

1 Ответ

3 голосов
/ 06 марта 2012

Вы можете написать пользовательский JsonValueProviderFactory , который использует 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);
    }
}

и в вашем Application_Start:

ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault());
ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...